图的存储方式:1.邻接表法2.邻接矩阵

模板 :经典的图结构:点 边。点:值(编号) 、入点、出、邻点和边;边:权值、from、to

public class Graph{public HashMap<Integer,Node> nodes;public HashSet<Edge> edges;public Graph(){nodes = new HashMap<>();edges = new HashSet<>();}
}public class Node{public int value;public int in;//入度public int out;//出度public ArrayList<Node> nexts;public ArrayList<Edge> edges;public Node(int value){this.value = value;in = 0;out = 0;nexts = new ArrayList<>();edges = new ArrayList<>();}
}public class Edge{public int weight;public Node from;public Node to;public Edge(int weight, Node from, Node to){this.weight = weight;this.from = from;this.to = to;
}
}

二维数组转化成熟悉的图结构

public static Graph createGraph(Integer[][] matrix){Graph graph = new Graph();for(int i = 0; i < matrix.length; i++){Integer from = matrix[i][0];Integer to = matrix[i][1];Integer weight = matrix[i][2];if(!graph.nodes.containsKey(from)){graph.nodes.put(from, new Node(from));}if(!graph.nodes.containsKey(to)){graph.nodes.put(to, new Node(to));}Node fromNode = graph.nodes.get(from);Node toNode = graph.nodes.get(to);Edge newEdge = new Edge(weight, fromNode. toNode);fromNode.nexts.add(toNode);fromNode.out++;toNode.in++;fromNode.edges.add(newEdge);graph.edges.add(newEdge);}return graph;
}

图的宽度优先遍历

1.利用队列实现

2.从源节点开始依次按照宽度进队列,然后弹出

3.每弹一个点,然后把该节点的所有的没有进过队列的邻接点放入队列

4.直到队列变空

public static void bfs(Node node){if(node == null){return ;}Queue<Node> queue = new LinkedList<>();HashSet<Node> set = new HashSet<>();queue.add(node);set.add(node);while(!queue.isEmpty()){Node cur = queue.poll();System.out.println(cur.value);//处理for(Node next : cur.nexts){if(!set.contains(next)){set.add(next);queue.add(next);}}}
}

广度(深度)优先遍历

1.利用栈实现

2.从源节点开始依次按深度放入栈,然后弹出

3.每弹一个点,把该节点下一个没有进过栈的邻接点放入栈

4.直到栈变空

public static dfs(Node node){if(node == null){return;}Stack<Node> stack = new Stack<>();HashSet<Node> set = new HashSet<>();stack.add(node);set.add(node);System.out.println(node.value);while(!stack.isEmpty()){Node cur = stack.pop();for(Node next : cur.nexts){if(!set.contains(next)){stack.push(cur);stack.push(next);set.add(next);System.out.println(next.value);break;}}}
}

拓扑排序算法

适用范围:要求有向图,且有入读为0的节点,且没有环

public static List<Node> sortedTopology(Graph graph){//key:某一个node//value:剩余的入度HashMap<Node, Integer> inMap = new HashMap<>();//入度为0的点,才能进这个队列Queue<Node> zeroInQueue = new LinkedList<>();for(Node node : graph.nodes.values()){inMap.put(node, node.in);if(node.in == 0){zeroInQueue.add(node);}}//拓扑排序的结果,依次加入resultList<Node> result = new ArrayList<>();while(!zeroInQueue.isEmpty()){Node cur = zeroInQueue.poll();result.add(cur);for(Node next : cur.nexts){inMap.put(next, inMap.get(next) - 1);if(inMap.get(next) == 0){zeroInQueue.add(next);}}}return result;
}

K算法

生成最小生成树(无向图)

边排序,优先考虑权重最小的边,看有没有成环(结合查询)

public static class mySets{public HashMap<Nodem List<Node>> setMap;public MySeys(List<Node> nodes) {for(Node cur : nodes){List<Node> set = new ArrayList<Node>();set.add(cur);setMap.put(cur, set);}}public boolean isSameSet(Node from , Node to){List<Node> fromSet = setMap.get(from);List<Node> toSet = setMap.get(to);return fromSet == toSet;}public void union(Node from , Node to){List<Node> fromSet = setMap.get(from);List<Node> toSet = setMap.get(to);for(Node toNode :  toSet){fromSet.add(toNode);setMap.put(toNode, fromSet);}}
}

k算法代码(并查集结构更快)

public static Set<Edge> kruskalMST(Graph graph) {UnionFind unionFind = new UnionFind();unionFind.makeSets(graph.nodes.values());PriorityQueue<Edge> priorityQueue = new PriorityQueue<>(new EdgeComparator());for(Edge edge : graph.edges){//M条边priorityQueue.add(edge);}Set<Edge> result = new HashSet<>();while(!priorityQueue.isEmpty()){Edge edge = priorityQueue.poll();    if(!unionFind.isSameSet(edge.from, edge.to)){result.add(edge);unionFind.union(edge.frim, edge.to);}}return result;}

p算法

每次只涉及一个点

public static Set<Edge> primMST(Graph graph){//解锁的边进入小根堆PriorityQueue<Edge> priorityQueue = new PriorityQueue<>(new EdgeComparator());HashSet<Node> set = new HashSet<>();Set<Edge> result = new HashSet<>();//依次挑选的边在resultfor(Node node : graph.nodes.values()){//node是开始点if(!set.contains(node)){set,add(node);for(Edge edge : node.edges){//由一个点,解锁所有相连的边priorityQueue.add(edge);}while(!priorityQueue.isEmpty()){Edge edge = priorityQueue.poll();//弹出解锁的边中,最小的边Node toNode = edge.to;//可能的一个新的点if(!set.contains(toNode)){//不含有的时候就是新的点set.add(toNode);result.add(edge);for(Edge nextEdge : toNode.edges){priorityQueue.add(nextEdge);}}}}}return result;
}

Dijkstra算法(适用于没有累加和为负的环,可能会导致锁死的边不对)

public static HashMap<Node, Integer> dijkstra1(Node head) {//从head出发到所有点的最小距离//key:从head出发到key//value : 从head出发到达key的最小距离//如果在表中,没有T的记录,含义是从head出发到T这个点的距离为正无穷HashMap<Node, Integer> distanceMap = new HashMap<>();distanceMap.put(head, 0);//已经求过距离的节点,存在selectedNodes中,再也不碰HashSet<Node> selectedNodes = new HashSet<>();Node minNode = getMinDistanceAndUnselectedNode(distanceMap, selectedNodes);while(minNode != null){int distance = distanceMap.get(minNode);for(Edge edge :  minNode.edges){Node toNode = edge.to;if(!distanceMap.containsKey(toNode)){distanceMap.put(toNode, distance + edge.weight);}distacneMap.put(edge.to, Math.min(distanceMap.get(toNode),distance + egde.weight));}selectedNodes.add(minNode);minNode = getMinDistanceAndUnselectedNode(distanceMap, selectedNodes);}return distanceMap;
}

B站左程云算法笔记06相关推荐

  1. 左程云算法笔记(四)哈希表和有序表的使用、链表

    左程云算法笔记(四) 哈希表的使用 有序表的使用 链表 单链表反转 (LC206) 双向链表反转 打印两个有序链表的公共部分 合并两个有序链表(LC21) 判断一个链表是否为回文结构 (LC234) ...

  2. 左程云算法笔记总结-基础篇

    基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...

  3. B站左程云算法视频笔记(01

    1.位运算 异或 ^ ,可理解为不进为相加,满足结合律和交换律 a^a=0: a^0=a: 交换a和b a=a^b: b=a^b: a=a^b: 但必须满足是位置不同的(同一内存位置自己异或结果为0) ...

  4. 算法与数据结构——算法基础——二叉树(java)(b站左程云课程笔记整理)

    二叉树 了解一个二叉树的递归序.先序.中序.后序 递归序:每个数会被打印三次(可以理解为前中后) 先序:头左右 中序:左头右 后序:左右头 public static class Node {publ ...

  5. B站左程云算法视频笔记05

    大数据 有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL (布隆过滤器或者哈希函数分流) [补充]某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种 ...

  6. 左程云算法笔记总结-基础提升篇

    提升01(哈希) 认识哈希函数 哈希函数的输入一般需要是无穷尽的,没有限制:输出可以有一定的范围,比如MD5加密后产生的字符串可以有2的32次方-1种,用十六进制表示需要16个字符. 相同的输入对应相 ...

  7. B站左程云算法视频高级班01

    题目1:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要不能用非基于比较的排序 [               ]假设是长度为9的数组 首先遍历数组 找出min 和 ma ...

  8. B站左程云算法视频基础提升02

    岛问题 一个矩阵中只有0和1两种值,每个位置都可以和自己的上下左右相连,如果一片1连在一起,这个部分叫做一个岛,求一个矩阵有多少个岛 思路:遍历,infect class Solution {publ ...

  9. B站左程云算法视频高级班05

    题目一:在一个无序数组中,求第k小的数 快排:荷兰国旗问题 BFPRT 有讲究的选择一个数 之后的步骤和快排一样 假设整个方法叫f函数 f(arr, k) 1)0~4一组 5~9一组 0~14一组 剩 ...

  10. LeetCode左程云算法课笔记

    左程云算法课笔记 剑指Offer 位运算 ^运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判 ...

最新文章

  1. HardwareSoftwareTutorial
  2. 控制台调用win32 API 示例二则
  3. Win API函数SetWindowOrgEx与SetViewportOrgEx
  4. MySQL学习第三章练习题
  5. 计算机基础- -认识磁盘
  6. Hibernate基础
  7. 笨方法“学习python笔记之关键字
  8. 在不同应用场景中,我们该如何进行测试呢?
  9. 在pytorch中expand_dim
  10. java程序的运行方式
  11. VS2010插件 - NuGet
  12. 未解决:configure: error: XCode tool ‘metal‘ neither found in path nor with xcrunchecking for metal...
  13. 昆仑通态触摸屏如何把参数由触摸屏传递到PLC_昆仑通态触摸屏的串口232通讯功能-----有谁用过?...
  14. vba 宏获取文件夹中所有excel文件,对slk文件数据每3000个求平均值
  15. 计算机休眠状态和关,win7系统关于睡眠和休眠这两种状态的区别
  16. shopify抓单按时间总是少一些的解决
  17. 莫甘娜的盾可以挡机器人_莫甘娜黑盾到底有多强,不仅可以免疫魔法伤害,这些技能都能免疫...
  18. 名称、系统服务-windows系统进程解析 -by小雨
  19. 走进诺奖大师系列:科斯(Ronald H.Coase)
  20. python运行cmd命令和opencv搭建_Python让蔡徐坤在我的命令行里打篮球!

热门文章

  1. MySQL笔记: B站宋红康最新教程(持续更新中)
  2. 数据加密 第四篇:对称密钥
  3. 自底向上语法分析LR(1)
  4. string类的常用方法
  5. 文章标题怎么伪原创?火车头标题伪原创插件
  6. 糖葫芦低通滤波器的设计
  7. riscv-gnu-toolchain下载安装
  8. 在线坐标系经纬度转换工具
  9. k-means聚类算法原理简析
  10. 小学计算机房荷载,资深暖通设计师总结的常用参数参考值,新手们都说感谢大神支招...