class6

  • 图的存储方式
    1)邻接表
    2)邻接矩阵
package com.godzuo.java;import java.util.HashMap;
import java.util.HashSet;/*** @author quanquan* @create 2020-05-03-20:40*/
public class Graph {public HashMap<Integer,Node> nodes;public HashSet<Edge> edges;public Graph() {nodes = new HashMap<>();edges = new HashSet<>();}
}
package com.godzuo.java;import java.util.ArrayList;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<>();}
}
package com.godzuo.java;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;}
}
package com.godzuo.java;/*** 生成图*/
public class GraphGenerator {public static Graph createGraph(Integer[][] matrix) {Graph graph = new Graph();for (int i = 0; i < matrix.length; i++) {Integer weight = matrix[i][0];Integer from = matrix[i][1];Integer to = 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,直到队列变空

  • 深度优先遍历

    1,利用栈实现

    2,从源节点开始把节点按照深度放入栈,然后弹出

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

    4,直到栈变空

package com.godzuo.java;import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;/*** @author quanquan* @create 2020-05-03-21:30*/
public class BFS {public static void bfs(Node node){if (node == null){return;}Queue<Node> queue = new LinkedList<>();HashSet<Node> map = new HashSet<>();queue.add(node);map.add(node);while (!queue.isEmpty()){Node cur = queue.poll();System.out.println(cur.value);for (Node next: cur.nexts){if(!map.contains(next)){map.add(next);queue.add(next);}}}}}
package com.godzuo.java;import java.util.HashSet;
import java.util.Set;
import java.util.Stack;/*** @author quanquan* @create 2020-05-03-21:49*/
public class DFS {public static void 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的节点,且没有环

package com.godzuo.java;import java.util.*;/*** @author quanquan* @create 2020-05-03-22:24*/
public class TopologySort {// directed graph and no looppublic static List<Node> sortedTopology(Graph graph){HashMap<Node, Integer> inMap = new HashMap<>();Queue<Node> zeroInQue = new LinkedList<>();for (Node node : graph.nodes.values()){ //遍历所有的点inMap.put(node, node.in);if (node.in == 0){zeroInQue.add(node);}}List<Node> result = new ArrayList<>();while (!zeroInQue.isEmpty()){Node cur = zeroInQue.poll();result.add(cur);for (Node next : cur.nexts){inMap.put(next,inMap.get(next)-1);if (inMap.get(next) == 0){zeroInQue.add(next);}}}return result;}
}
  • 最小生成树算法(要求:无向图):kruskal算法 和 prim算法

    • kruskal算法:从小权重的边开始考察
    package com.godzuo.java;import java.util.Collection;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.PriorityQueue;
    import java.util.Set;//undirected graph only
    public class Kruskal {// Union-Find Setpublic static class UnionFind {private HashMap<Node, Node> fatherMap;private HashMap<Node, Integer> rankMap;public UnionFind() {fatherMap = new HashMap<Node, Node>();rankMap = new HashMap<Node, Integer>();}private Node findFather(Node n) {Node father = fatherMap.get(n);if (father != n) {father = findFather(father);}fatherMap.put(n, father);return father;}public void makeSets(Collection<Node> nodes) {fatherMap.clear();rankMap.clear();for (Node node : nodes) {fatherMap.put(node, node);rankMap.put(node, 1);}}public boolean isSameSet(Node a, Node b) {return findFather(a) == findFather(b);}public void union(Node a, Node b) {if (a == null || b == null) {return;}Node aFather = findFather(a);Node bFather = findFather(b);if (aFather != bFather) {int aFrank = rankMap.get(aFather);int bFrank = rankMap.get(bFather);if (aFrank <= bFrank) {fatherMap.put(aFather, bFather);rankMap.put(bFather, aFrank + bFrank);} else {fatherMap.put(bFather, aFather);rankMap.put(aFather, aFrank + bFrank);}}}}public static class EdgeComparator implements Comparator<Edge> {@Overridepublic int compare(Edge o1, Edge o2) {return o1.weight - o2.weight;}}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) {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.from, edge.to);}}return result;}
    }
    • prim算法:按照点来考察
    package com.godzuo.java;import java.security.PublicKey;
    import java.util.*;/*** @author quanquan* @create 2020-05-03-23:37*/
    public class Prim {public static class EdgeComparator implements Comparator<Edge> {@Overridepublic int compare(Edge o1, Edge o2) {return o1.weight - o2.weight;}}public static Set<Edge> primMST(Graph graph) {PriorityQueue<Edge> priorityQueue = new PriorityQueue<>(new EdgeComparator());HashSet<Node> set = new HashSet<>();Set<Edge> result = new HashSet<>();for (Node node : graph.nodes.values()) { //若输入的图为森林,则有多个生成树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算法 适用范围:没有权值为负数的边

class6 图(左程云左神算法 初级笔记 2018)相关推荐

  1. class3 队列、栈和链表(左程云左神算法 初级笔记 2018)

    class 3 用数组结构实现大小固定的队列和栈 package com.godzuo.java;/*** @author quanquan* @create 2020-04-20-22:36*/ p ...

  2. class4 二叉树(左程云左神算法 初级笔记 2018)

    class 4 DAY6 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 package com.godzuo.java;import java.util.Stack;/*** @auth ...

  3. 左程云牛客算法初级班笔记

    第一课 第二课 第三课 第四课 第五课 第六课 第七课 第八课 个人的上课笔记 记录了一些算法题细节的理解要点 第一课 估计递归大小复杂度的通式 a子过程样本量 b子过程发生了多少次 0: 除去子过程 ...

  4. 左程云算法课—02课程笔记

    目录 一.剖析递归行为和递归行为时间复杂度的估算 master公式的使用(满足子问题等规模) 二.归并排序 归并排序的扩展 小和问题 逆序对问题 三.荷兰国旗问题 问题一 问题二 四.快速排序 不改进 ...

  5. 数据结构与算法XS班-左程云第八节课笔记(归并排序和快速排序)

    第8节 归并排序和快速排序 ##这是数据结构与算法新手班-左程云第八节课的笔记## 归并排序 归并排序实际上是一个很经典的排序方法,时间复杂度o(N*logN). 递归版本(图解排序算法(四)之归并排 ...

  6. 数据结构与算法XS班-左程云第一节课笔记(位运算、算法是什么、简单排序)

    第1节 位运算.算法是什么.简单排序 ##这是数据结构与算法新手班-左程云第一节课的笔记## 1. 位运算 // 你们会不会表示一个数字的32位啊? // Java中int类型默认以32位二进制数在计 ...

  7. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

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

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

  9. 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

  10. leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)

    题目 https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/ 题解 重叠区间问题可以总结为在坐标轴上若干个位 ...

最新文章

  1. Xcode 6 Bug:Interface Builder文件中的未知类
  2. 信令风暴研究现状总结
  3. SqlServer 中Binary类型的数据如何转化为字符串
  4. 第四讲 一阶线性ODE换元法
  5. 进阶丨如何让你的数据分析更加简洁专业
  6. tableau certificate
  7. 动图-完整清晰展示TCP的三次握手与四次挥手
  8. php之变量覆盖漏洞讲解
  9. SAP UI5日期字段的显示逻辑和用法
  10. Matlab矩阵查找
  11. HTC Desire试玩手记之四(GPS连不上)
  12. PASCAL VOC2012数据集介绍与制作自己的数据集
  13. java给链表赋值_Java链表操作代码
  14. 攻防世界逆向入门题之getit
  15. Android锁屏壁纸 代码,android 锁屏壁纸和桌面壁纸的设置实现
  16. php电子病历毕业设计,基于区块链的电子病历系统设计与实现(自制毕设)
  17. 压六类双绞线网线水晶头,
  18. 公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, 用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
  19. Shell脚本变量学习_02
  20. Linux Cannot assign requested address

热门文章

  1. IOS 音乐播放器 (附源码)
  2. 分享自己的超轻量级高性能ORM数据访问框架Deft
  3. VC/MFC 编程经验
  4. Hive之数据类型、查询操作
  5. python概率分布拟合_用Python实现概率分布
  6. 2006(首届)Web2.0十大创新品牌
  7. 后分布式时代: 多数派读写的「少数派」实现
  8. CentOS7 忘记密码——重置
  9. QUIC成为了HTTP/3的标准传输协议!
  10. 我想给我的公众号改个名,好不好嘞