剑指 Offer II 110. 所有路径 - 力扣(Leetcode)
深度优先遍历,动态维护路径,回溯
207. 课程表 - 力扣(Leetcode)
不能存在循环依赖 判别环
建立邻接表,回溯法判断路径是否出现环
210. 课程表 II - 力扣(Leetcode)
邻接表建立图,List<Integer>[] graph = new LinkedList[numCourses];
拓扑排序 存在换则无法排序,获得后续遍历结果,再反转
dfs:需要判断环
bfs:队列,记录节点的入度,入度为0,则代表已经前置节点已经都遍历过了,可以入队
210. 课程表 II - 力扣(Leetcode)
构建有向图,输出拓扑排序
剑指 Offer II 106. 二分图 - 力扣(Leetcode)
在遍历的时候,给节点上色(true或false),当遇到访问过的节点,判断颜色是否不一样
并查集UF
找根节点,并且压缩路径
class UF {
// 连通分量个数
private int count;
// 存储每个节点的父节点
private int[] parent;
// n 为图中节点的个数
public UF(int n) {
this.count = n;
parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
}
// 将节点 p 和节点 q 连通
public void union(int p, int q) {
int rootP = find(p);
int rootQ = find(q);
if (rootP == rootQ)
return;
parent[rootQ] = rootP;
// 两个连通分量合并成一个连通分量
count--;
}
// 判断节点 p 和节点 q 是否连通
public boolean connected(int p, int q) {
int rootP = find(p);
int rootQ = find(q);
return rootP == rootQ;
}
public int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
// 返回图中的连通分量个数
public int count() {
return count;
}
}
KRUSKAL 最小生成树算法
将边以代价升序,依次加入,用UF(union find)算法,判定没有环,并且只有一个连通图
Prim 算法
每次选取横切边权值最小的加入树。
Dijkstra 算法