首页 > 其他 > 详细

算法7-5:连接部件

时间:2014-06-18 06:09:24      阅读:417      评论:0      收藏:0      [点我收藏+]

同学们一定用过Windows中的画图吧。那么画图中的油漆桶功能是如何实现的呢?


bubuko.com,布布扣


这个问题可以通过DFS深度优先搜索解决。


目标


我们要实现的目标是在常数的时间内判断某两个节点是否连接。


前面章节中介绍了并查集算法,并查集确实可以解决这个问题。我们今天来介绍另外一种办法,那就是DFS深搜。


为了解决这个问题专门建立一个对象,对象的轮廓如下:

public class ConnectedComponnent {
    public ConnectedComponnent(Graph G) {
    }
 
    // 判断两个顶点是否连接
    public boolean connected(int v, int w) {
    }
 
    // 连接部件的个数
    public int count() {
    }
 
    // 顶点所在的连接部件的编号
    public int id(int v) {
    }
}



数学定义


判断两个顶点是否连接在离散数学中是等价关系,它具有:

反射性:v和v是连接的

对称性:如果v和w是连接的,那么w和v也是连接的

传递性:如果v和w是连接的,w和z是连接的,那么v和z也是连接的


连接部件的定义:相互连接的顶点最大集合。


问题解决


为了解决上述的问题,首先要对图进行预处理。预处理的目标就是区分图中的连接部件。


区分连接部件的步骤如下:

  1. 将所有的顶点都标记为未访问

  2. 对于每个未访问的顶点,使用DFS标记部件编号


代码

public class ConnectedComponnent {
    private boolean[] visited;
    private int[] id;
    private int count;
 
    public ConnectedComponnent(Graph G) {
        visited = new boolean[G.V()];
        id = new int[G.V()];
        cc(G);
    }
 
    // 判断两个顶点是否连接
    public boolean connected(int v, int w) {
        return id[v] == id[w];
    }
 
    // 连接部件的个数
    public int count() {
        return count;
    }
 
    // 顶点所在的连接部件的编号
    public int id(int v) {
        return id[v];
    }
 
    private void cc(Graph G) {
        for (int i = 0; i < G.V(); i++) {
            if (!visited[i]) {
                dfs(G, i);
                count++; // 注意:这句话不能放在if之外。不然count总是等于顶点数量
            }
        }
    }
 
    private void dfs(Graph G, int v) {
        visited[v] = true;
        id[v] = count;
        for (int w : G.adj(v)) {
            if(!visited[w]) {
                dfs(G, w);
            }
        }
    }
}


应用


下图是某高校的人际关系图。如果把人际关系看成一张图,那么这里面就可以很清楚地看到有大大小小的连接部件。


bubuko.com,布布扣


探测星空图中的星星数量。


bubuko.com,布布扣



算法7-5:连接部件,布布扣,bubuko.com

算法7-5:连接部件

原文:http://blog.csdn.net/caipeichao2/article/details/31803757

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!