图-传递闭包

图的传递闭包是指修正后的邻接矩阵表示的图。(见Graph 图-邻接矩阵法 )

在多个顶点的有向图中,每个顶点可以到按照方向到达一定的节点,这叫图的连通性。有种方法直接告诉我们,图中的两个节点是否可以联通,这里说的是WarShall算法。

WarShall的基本原理是,如果A可以到达B,且C可以到达A,则C可以到达B。通过对邻接矩阵的修正可以做到这点。随然这里举例是将两步可并成一步,但数学上可以证明这种修正可以达到任意步骤。

下面是代码:

 

 1 class  WarShall  {
 2    private boolean[][] adjMat;
 3
 4    WarShall(int size) {
 5        adjMat = new boolean[size][size];
 6    }

 7
 8    void connect(int from, int to) {
 9        adjMat[from][to] = true;
10    }

11
12    boolean isConnect(int from, int to) {
13        return adjMat[from][to];
14    }

15
16    void warshall() //warshall算法
17        for(int y=0; y<adjMat.length; y++) //查找每一行
18            for(int x=0; x<adjMat.length; x++) // 查找每个单元格
19                if(adjMat[y][x])    //如果 y 可以到达 x
20                    for(int z=0; z<adjMat.length; z++)    //查找所有行的y列
21                        //如果 z 可以到达y ,说明z 可以直接到达x
22                        if(adjMat[z][y]) adjMat[z][x] = true;    
23        
24    }

25
26    boolean[][] getConnections() {
27        return adjMat;
28    }

29
30    public static void main(String[] args) {
31        WarShall w = new WarShall(5);
32        w.connect(0,2);
33        w.connect(1,0);
34        w.connect(1,4);
35        w.connect(3,4);
36        w.connect(4,2);
37        for(boolean[] a: w.getConnections()) {
38            for(boolean b: a) System.out.print(b + " ");
39            System.out.println();
40        }

41        w.warshall();
42        System.out.println("==================");
43        for(boolean[] a: w.getConnections()) {
44            for(boolean b: a) System.out.print(b + " ");
45            System.out.println();
46        }

47
48        assert w.isConnect(3,2);
49    }

50}

你可能感兴趣的:(图-传递闭包)