查找有向图中的强连通分量
图学习笔记索引
001自定义输入流In类实现
002背包数据类型Bag实现
003无向图数据类型实现
004基于图的深度优先搜索
005使用深度优先搜索找图中的所有连通分量
005-1基于深度优先搜索查找图中连通路径
006基于深度优先搜索判断图中是否存在环
007基于深度优先搜索判断一个无向图图是否是一个二分图
008广度优先搜索查找连通图中的最短路径
009有向图数据类型实现
010有向图的可达性
011带权重的无向边数据类型Edge实现
012加权无向图数据类型实现
013寻找有向环
014有向图中基于深度优先搜索的顶点排序
本文参考《算法(第4版)》
1.实现代码
点击文字获取:001自定义输入流In类实现
从文件中读取图的顶点关系。
tinyDG.txt中的内容:
13
22
4 2
2 3
3 2
6 0
0 1
2 0
11 12
12 9
9 10
9 11
8 9
10 12
11 4
4 3
3 5
7 8
8 7
5 4
0 5
6 4
6 9
7 6
Java代码:
package algorithms.graph;
import java.io.IOException;
public class KosarajuSCC {
private boolean marked[];
private int[] id;
private int count = 0;
public KosarajuSCC(Digraph G){
marked = new boolean[G.V()];
id = new int[G.V()];
DepthFirstOrder order = new DepthFirstOrder(G.reverse());
for(int s : order.reversePost()) {
if(!marked[s]){
dfs(G, s);
count++;
}
}
}
public void dfs(Digraph G, int v) {
marked[v] = true;
id[v] = count;
for(int w : G.adj(v))
if(!marked[w])
dfs(G, w);
}
public boolean stronglyConnected(int v, int w) {
return id[v] == id[w];
}
public int id(int v) {
return id[v];
}
public int count() {
return count;
}
public static void main(String[] args) throws IOException {
In in = new In("D:\\tinyDG.txt");
Digraph G = new Digraph(in);
System.out.println(G);
KosarajuSCC scc = new KosarajuSCC(G);
StringBuffer sb = new StringBuffer();
for(int i = 0; i < scc.count; i++) {
sb.append(i + ": ");
for(int v = 0; v < G.V(); v++) {
if(scc.id(v) == i) {
sb.append(v);
sb.append(",");
}
}
sb.append("\n");
}
System.out.println("所有强连通分量:");
System.out.println(sb.toString());
}
}
输出:
13 vectors; 22 edges
0: 5 1
1:
2: 0 3
3: 5 2
4: 3 2
5: 4
6: 9 4 0
7: 6 8
8: 7 9
9: 11 10
10: 12
11: 4 12
12: 9
所有强连通分量:
0: 1,
1: 0,2,3,4,5,
2: 9,10,11,12,
3: 6,
4: 7,8,
2.总结
来源:CSDN
作者:栗子树6
链接:https://blog.csdn.net/m0_37692918/article/details/104088965