015查找有向图中的强连通分量

醉酒当歌 提交于 2020-01-26 22:52:02

图学习笔记索引

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.总结

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!