第四章 图(三) - 《算法》读书笔记

第四章 图(三)

4.1.6 连通分量

  • 连通是一种等价关系,它能将所有顶点切分为等价类
  • 连通分量的API如下:
public class CC
CC(Graph G) 预处理构造函数
boolean connected(int v, int w) v和w连通吗
int count() 连通分量数
int id(int v) v所在的连通分量的标识符(0~count()-1)

4.1.6.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++)
        	if(!marked[s]){
                dfs(G, s);
                count++;
            }
    }
    
    private void dfs(Graph G, int v){
        marked[v] = true;
        id[v] = count;
        for(int w: G.adj(v))
            if(!marked[w])
                dfs(G, w);
    }  
    public boolean connected(int v, int w){
        return id[v] == id[w];
    }   
    public int id(int v){
        return id[v];
    }
    public int count(){
        return count;
    }
}

深度优先搜索的预处理使用的时间和空间与V+E成正比,且可以在常数时间内处理关于图的连通性查询。

posted @ 2021-02-08 21:10  一天到晚睡觉的鱼  阅读(43)  评论(0)    收藏  举报