圖-傳遞閉包
圖的傳遞閉包是指修正后的鄰接矩陣表示的圖。(見Graph 圖-鄰接矩陣法 )
在多個頂點的有向圖中,每個頂點可以到按照方向到達一定的節(jié)點,這叫圖的連通性。有種方法直接告訴我們,圖中的兩個節(jié)點是否可以聯(lián)通,這里說的是WarShall算法。
WarShall的基本原理是,如果A可以到達B,且C可以到達A,則C可以到達B。通過對鄰接矩陣的修正可以做到這點。隨然這里舉例是將兩步可并成一步,但數(shù)學上可以證明這種修正可以達到任意步驟。
下面是代碼:
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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50
