学习心得:这是深度优先的一个直接应用,觉得刚开始看不是特别理解,所以就一句一句去啃,然后就懂了,不过要熟练掌握的话,还是要去多打几遍。
首先了解API
在来看函数和注释
/*使用深度优先搜索找出图中的所有连通分量
方法int count() 表示图中有几个连通分量
方法id(int v) 表示顶点v在第几个连通分量中
方法boolean connect(int v,int w) 表示两个顶点是否连通
数组int id[]的大小是图的顶点数G.V(),表示这个顶点所在连通分量的id;也就是所谓的标识符,范围是(0 ~ count - 1)
*/
public class CC
{
private boolean[] marked;
private int[] id;
private int count;
public CC(Graph G) //图的预处理构造函数
{
marked = new boolean[G.V()];
id = new int[G.V()];
for(int s=0;s<G.V();s++) //要求对每一个顶点都进行dfs,
if(!marked[s]) //dfs时会不断深入mark和订单s连通顶点,一但遇到没有s连通的点,那么就知道他们属于不同的连通分量里
{
dfs(G,s);
count++;
}
}
public void dfs(Graph G,int s)
{
marked[s] = true;
id[s] = count; //和最初版的dfs相比,就多了这一句,表示顶点s所在的id,即该顶点在哪个连通分量里面
for(int w: G.adj(s))
if(!marked[s])
dfs(G,s);
count++;
}
public boolean connected(int v,int w) //用于坚定两个顶点是否联通
{return id[v]==id[w];}
public int id(int v) //给出顶点索引,就知道它所在的连通分量的id,真的很强大,很有实际用处!!
{ return id[v];}
public int count()
{return count;}
}