每对顶点之间的最短路径

设lij(m) 是从顶点i到顶点j的至多包含m条边的任何路径的权值最小值。当m=0时,lij(0) =0 if i=j or INFINITY if i!=j

递归定义lij(m) =min 1=<k<=n{lik(m-1) + wkj}

实际上从i到j的最短路径至多包含n-1条边,因此lij(n-1)即为所要求的值。

注意L(1)=W

递归的函数如下

View Code
1 EXTEND-SHORTEST-PATH(L,W)
2 L'=new Matrix
3 for(i=1;i<=n;++i)
4 for(j=1;j<=n;++j)
5 L'[i][j]=INFINITY
6 for(k=1;k<=n;++k)
7 L'[i][j]=min(L'[i][j],L[i][k]+W[k][j])

 

整个过程如下

View Code
1 SLOW-SHORTEST-PATH(W)
2 L(1)=W
3 for(i=2;i<=n-1;++i)
4 L(i)=EXTEND-SHORTEST-PATH(L(i-1),W)
5 return L(n-1)

 

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

 

posted @ 2012-03-13 17:15  Cavia  阅读(337)  评论(0编辑  收藏  举报