DFS求连通分量的个数(简单易懂)

DFS算法求一个图的连通分量的个数

用一张图来说明一下什么是连通分量

DFS求连通分量的个数(简单易懂)_第1张图片

①:经过一次DFS所有的结点都会被遍历,所以连通分量为1

②:从结点1开始,经过一次DFS只能遍历完1 2 3 4 5,还剩下7 8需要再进行一次DFS,这个的连通分量就是2

结论:连通分量的个数就是DFS使用的次数

public class Connect{
    //对②图建立邻接表,即建立每一个结点和它相连的所有结点的HashMap表
    HashMap<Integer,List<Integer>> roots=new HashMap<>();
    public void init(){//初始化数据
        roots.put(1,Arrays.asList(2,3,4));
        roots.put(2,Arrays.asList(1,5));
        roots.put(3,Arrays.asList(1));
        roots.put(4,Arrays.asList(1));
        roots.put(5,Arrays.asList(2));
        roots.put(7,Arrays.asList(8));
        roots.put(8,Arrays.asList(7));
    }
    public static void main(String[] args){
        Connect connect=new Connect();
        connect.init();
        int count=connect.dfs();
        System.out.println(count);
    }
    HashMap<Integer,Boolean> status=new HashMap<>(); //记录每个结点是否被访问
    public int dfs(){
 		int count=0;	//记录调用DFS的次数
        Set<Integer> set=roots.keySet();//所有结点的集合
        for(int key:set){
            if(!status.containsKey(key)){
            	count++;//每调用一次就加1
                DFS(key);
        	}
        }
        return count;
    }
    Stack<Integer> stack=new Stack<>();
    //一个结点的话栈可以定义在方法外边,多个结点都要判断是否连通的时候Stack就得定义在方法里面
    //这是因为对下一个结点进行判断的时候,如果栈定义在外边则上一个结点遍历遗留的数据还可能存在在栈内
    public void DFS(int startPoint){
        stack.push(startPoint);
        status.put(startPoint,true);
        if(stack.empty()){
            return;
        }
        int vertax=stack.pop();
        List<Integer> list=roots.get(vertax);
        for(int point:list){
            if(!status.getOrDefault(point,false)){
                stack.push(point);
                status.put(point,true);
                DFS(point);
            }
        }
    }
}

有问题随时提出啊,欢迎骚扰! ?

你可能感兴趣的:(DFS求连通分量的个数(简单易懂))