图的传递闭包是指修正后的邻接矩阵表示的图。(见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}
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}