有向图的传递闭包

时间:2021-09-28 22:39:56

定义:有向图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 }