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;}
    }
  • 相关阅读:
    转 new和malloc的区别
    转 内联函数
    转 C++宏定义详解
    转 内联函数和宏定义的区别
    转 C++中不能声明为虚函数的有哪些函数
    转 PV操作简单理解
    转 Python执行系统命令的方法
    转 常量指针和指针常量的区别详解
    转 python语法学习面向对象之继承
    Singleton、MultiThread、Lib——实现单实例无锁多线程安全API
  • 原文地址:https://www.cnblogs.com/LZYY/p/3402679.html
Copyright © 2011-2022 走看看