有向圖的傳遞閉包


定義:有向圖G=(V,E),G的傳遞閉包定義為圖G*=(V,E*),其中E*={(i,j):圖G中存在一條從i到j的通路}

 方案1:

對E中每條邊賦以權值1,然后運行Floyd-Warshall算法。如果從頂點i到頂點j存在一條路徑,則dij < n,否則dij=INFINITY.

 

方案2:

如果圖G中從頂點i到頂點j存在一條通路,且其所有中間頂點均屬於集合{1,2,...,k},則定義tij(k) 為true,否則為false。我們把邊(i,j)加入E*中當且僅當tij(n) = true

遞歸式為

tij(0) =false if i!=j and (i,j)不屬於E  or true if i=j or (i,j)屬於E

 

對k>=1

tij(k)=tij(k-1) || (tik(k-1) && tkj(k-1))

 

 

closure
 1 #include <iostream>
2 using namespace std;
3
4 typedef struct Graph
5 {
6 static const int vertex_num=4;
7 int edge_num;
8 int W[16];
9 }Graph;
10
11
12
13 void Create_Graph(Graph* g)
14 {
15 for(int i=0;i<16;++i)
16 {
17 if(i%5==0)
18 g->W[i]=0;
19 else
20 g->W[i]=999;
21 }
22 cout <<"Enter edges num:";
23 cin >>g->edge_num;
24 for(int i=0;i<g->edge_num;++i)
25 {
26 int u,v,w;
27 cout <<"Enter u,v,w:";
28 cin >>u>>v>>w;
29 int index=4*(u-1)+v-1;
30 g->W[index]=w;
31 }
32 }
33
34
35 bool T[4][16];
36
37
38
39 void Transitive_Closure(const Graph* g)
40 {
41 for(int i=1;i<=4;++i)
42 {
43 for(int j=1;j<=4;++j)
44 {
45 int index=4*(i-1)+j-1;
46 if(g->W[index]==999)
47 T[0][index]=false;
48 else
49 T[0][index]=true;
50 }
51 }
52 for(int k=1;k<=4;++k)
53 {
54 for(int i=1;i<=4;++i)
55 {
56 for(int j=1;j<=4;++j)
57 {
58 T[k][4*(i-1)+j-1]=T[k-1][4*(i-1)+j-1] || (T[k-1][4*(i-1)+k-1] && T[k-1][4*(k-1)+j-1]);
59 }
60 }
61 }
62
63 for(int i=0;i<16;++i)
64 {
65 int u=i/4+1;
66 int v=i%4+1;
67 if(T[4][i])
68 cout <<"There is a path from "<<u<<" to "<<v<<endl;
69 }
70 }
71
72
73 int main()
74 {
75 Graph* g=new Graph;
76 Create_Graph(g);
77 Transitive_Closure(g);
78
79 delete g;
80 return 0;
81 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM