深度优先用法之查找连通分量

 

学习心得:这是深度优先的一个直接应用,觉得刚开始看不是特别理解,所以就一句一句去啃,然后就懂了,不过要熟练掌握的话,还是要去多打几遍。

首先了解API

Q`3FP$NT)@Z04)ZO%{}VT90

在来看函数和注释

/*使用深度优先搜索找出图中的所有连通分量
方法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;}
}
原文地址:https://www.cnblogs.com/LZYY/p/3402679.html