下面的代码是基于java语言的求解连通分量的具体代码实现,其功能包含求解连通分量的个数,输出每一个连通分量的节点。判断两个节点是否处于同一个连通分量之中。
import java.util.ArrayList;
public class ConnectedComponent
{
private Graph G;
private int [] visited;
private int cccount=0;
public ConnectedComponent(Graph G)
{
this.G=G;
visited=new int[G.V()];
for(int i=0;i<visited.length;i++)
{
visited[i]=-1;
}
for(int v=0;v<G.V();v++)
{
if(visited[v]==-1)
{
dfs(v,cccount);
cccount++;
}
}
}
private void dfs(int v,int ccid)
{
visited[v]=ccid;
for(int w:G.adj(v))
{
if(visited[w]==-1)
{
dfs(w,ccid);
}
}
}
public ArrayList<Integer>[] components()
{
ArrayList<Integer>[] res=new ArrayList[cccount];
for(int i=0;i<cccount;i++)
{
res[i]=new ArrayList<>();
}
for(int v=0;v<G.V();v++)
{
res[visited[v]].add(v);
}
return res;
}
public int count()
{
for(int e:visited)
{
System.out.print(e+" ");
}
System.out.println();
return this.cccount;
}
public boolean isConnected(int v,int w)
{
G.validateVertex(v);
G.validateVertex(w);
return visited[w]==visited[v];
}
public static void main(String[] args)
{
Graph g=new Graph("g.txt");
ConnectedComponent cc=new ConnectedComponent(g);
ArrayList<Integer>[] comp=cc.components();
for(int ccid=0;ccid<comp.length;ccid++)
{
System.out.print(ccid+":");
for(int w:comp[ccid])
{
System.out.print(w+" ");
}
System.out.println();
}
}
}