zoukankan      html  css  js  c++  java
  • 深度优先用法之查找连通分量

     

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

    首先了解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;}
    }
  • 相关阅读:
    QT学习——dialog、widget、mainwindow的区别和选择
    剑指offer——二叉树的深度
    位运算实现加减乘除四则运算
    剑指offer——求两个整数和
    C++常用设计模式
    从编程实现角度学习 Faster R-CNN(附极简实现)
    剑指offer——最小的k个数
    剑指offer——对称二叉树
    java 定时器
    rocketmq consumer接收到的MessageExt中各个字段的说明
  • 原文地址:https://www.cnblogs.com/LZYY/p/3402679.html
Copyright © 2011-2022 走看看