floyd算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.6.2每一对顶点间的最短路径 Dijkstra算法是求源点到其它顶点的最短路 径。怎样求任意两个顶点之间的最短路径?我们 可以把Dijkstra算执行n次,每次从不同的顶点开 始,则算法时间复杂度为O(n3)。 Floyd弗洛伊德给出了另一个算法,时间复 杂度也是O(n3),但是形式上简单些。
从演示中看算法思想 一个简单的图及其邻接矩阵如下:
c (ca,3)
D[b][c]+D[c][a]= 2+3<D[b][a]=6, 所以如果从c绕, 更近,那么应该 更新。
D(2)
a a (aa,0) b c (ca,3)
b (ab,4) (bb,0) (cab,7)
c (abc,6) (bc,2) (cc,0)
6 a 4
b
2 11
D(1)
a a (aa,0)
for(i=1;i<=vex_num;i++) {//打印每两个顶点之间的路径 for(j=1;j<=vex_num;j++) { for(k=0;k<p[i][j].size();k++) cout<<p[i][j][k]<<" "; cout<<D[i][j]; cout<<endl; } }
c (ca,3)
D[c][a]+D[a][b]=3+ 4<D[c][b]= ∞ ,所 以如果从a绕,更 D(0) 近,那么应该更新。
a a (aa,0) b (ba,6) c (ca,3)
b (ab,4) (bb,0)
c (ac,11) (bc,2) (cc,0)
6 a 4
b
2 11
D(-1)
a a (aa,0)
D(2)
a a (aa,0) b c (ca,3)
b (bb,0) (cab,7)
c (abc,6) (bc,2) (cc,0)
6 a 4
b
2 11
D(1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cab,7)
c (abc,6)
(bc,2) (cc,0)
3
c
c (ca,3)
D(0)
a a (aa,0) b (ba,6) c (ca,3)
b (ab,4) (bb,0)
c (ac,11)
(cc,0)
6 a 4
b
2 11
D(-1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cb, ∞)
c (ac,11)
(bc,2) (cc,0)
3
c
c (ca,3)
c (bc,2) (cc,0)
6 a 4
b
2 11
D(0)
a a (aa,0) b (ba,6)
c (ca,3)
b (ab,4) (bb,0)
(cab,7)
c (ac,11) (bc,2)
(cc,0)
3
c
D[a][b]+D[b][c]= 6<D[a][c],所以 如果从b绕,更 近,那么应该更 新。
6 a 4
b
2 11
D(-1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cb, ∞)
c (ac,11)
(bc,2) (cc,0)
3
c
c (ca,3)
本来路径上源点 或终点就有a的 不必考虑。
对角线上的也不 必考虑
D(0)
a a (aa,0) b (ba,6) c (ca,3)
D(-1)
6 a 3 4 2 11 c
b
a a (aa,0) b (ba,6)
b (ab,4) (bb,0)
c (ac,11) (bc,2)
c (ca,3)
(cb, ∞)
(cc,0)
• 从上面的D(-1)开始,对于每两个顶点u、v, 在D(-1)中存储着一条路径u…v。现在我们 考察,试着把a加到u、v的路径上能否,得 到一条更短的路径,即如果 u…a+a…v<u…v的话,能够找到一条更短 的路径。
}
• 算法结束
c
D(1)
a a (aa,0) b (ba,6) c
b (ab,4) (bb,0) (cab,7)
c (abc,6) (bc,2) (cc,0)
6 a 4
b
2 11
D(0)
a a (aa,0) b (ba,6)
c (ca,3)
b (ab,4) (bb,0)
(cab,7)
c (ac,11) (bc,2)
D(2)
a a (aa,0) b c (ca,3)
b (ab,4) (bb,0) (cab,7)
c (abc,6) (bc,2) (cc,0)
6 a 4
b
2 11
D(1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cab,7)
c (abc,6)
(bc,2) (cc,0)
3
c
6 a 4
b
2 11
D(0)
a a (aa,0) b (ba,6)
c (ca,3)
b (ab,4) (bb,0)
(cab,7)
c (ac,11) (bc,2)
(cc,0)
3
c
本来路径上源点 或终点就有b的 不必考虑。
对角线上的也不 必考虑
D(1)
a a (aa,0) b (ba,6) c
b (ab,4) (bb,0) (cab,7)
(cc,0)
3
c
D[c][b]+D[b][a]= 7+6>D[c][a]=3, 所以如果从b绕, 反而远,那么这 一项不变。
D(1)
a a (aa,0) b (ba,6) c
b (ab,4) (bb,0) (cab,7)
c (abc,6) (bc,2) (cc,0)
6 a 4
b
2 11
D(0)
a a (aa,0) b (ba,6)
for(k=1;k<=vex_num;k++) {//对于每一个顶点都要试探 for(i=1;i<=vex_num;i++) { for(j=1;j<=vex_num;j++) {//在顶点i和顶点j之间的路径上试探k if(i==j)continue;//对角线上的元素(即顶点自身之 //间)不予考虑 if(D[i][k]+D[k][j]<D[i][j]) {//发现更短的路径 D[i][j]=D[i][k]+D[k][j]; //新的i、j间的路径由两部分组成 //p[i][k]+p[k][j] p[i][j]=p[i][k] for(int m=1;m<p[k][j].size();m++) p[i][j].push_back(p[k][j][m]); } } } }
c (abc,6) (bc,2) (cc,0)
• 现在,已经把所有的顶点都试了一遍,算法 结束。每两个顶点之间的路径如D(2)所示。
D(2)
a a (aa,0)
b (ab,4)
c (abc,6)
b (bca,5)
c (ca,3)
(bb,0)
(cab,7)
(bc,2)
(cc,0)
采用图的邻接矩阵的存储结构 怎样构造一个图,在此不赘述,直接给出floyd-wallshall算法。 void MDNet::Floyd(CDC *pDC) { typedef vector<int> path;//使用顺序表模板 path p[max_vertex_num][max_vertex_num]; //p存放每对顶点之间的最短路径 int D[max_vertex_num][max_vertex_num]; // D存放每对顶点之间的最短路径值 int i,j,k; for(i=1;i<=vex_num;i++) {//初始化 for(j=1;j<=vex_num;j++) { p[i][j].push_back(i); p[i][j].push_back(j); //顶点i和顶点j之间的路径初始时就是ij。 D[i][j]=arcs[i][j];//路径值为边(i,j)的权值 } }
6 a 4
b
2 11
D(1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cab,7)
c (abc,6)
(bc,2) (cc,0)
3
c
c (ca,3)
本来路径上源点 或终点就有c的 不必考虑。
对角线上的也不 必考虑
D(2)
a a (aa,0) b c (ca,3)
b (bb,0) (cab,7)
b (ba,6)
b (ab,4)
(bb,0) (cab,7)
c (abc,6)
(bc,2) (cc,0)
3
c
c (ca,3)
D[b][c]+D[c][a]= 2+3<D[b][a]=5, 所以如果从c绕, 更近,那么应该 更新。
D(2)
a a (aa,0) b (bca,5) c (ca,3)
b (ab,4) (bb,0) (cab,7)
c (abc,6) (bc,2) (cc,0)
6 a 4
b
2 11
D(1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cab,7)
c (abc,6)
(bc,2) (cc,0)
3
c
c (ca,3)
D[a][c]+D[c][b]= 6+7>D[a][b]=4, 所以如果从c绕, 反而远,那么这 一项不变。
b (ab,4) (bb,0)
c (ac,11)
(cc,0)
6 a 4
b
2 11
D(-1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cb, ∞)
c (ac,11)
(bc,2) (cc,0)
3
c
c (ca,3)
D[b][a]+D[a][c]= 6+11>D[b][c]=2, 所以如果从a绕, 反而远,那么这 一项不变。
c (ca,3)
b (ab,4) (bb,0)
(cab,7)
c (ac,11) (bc,2)
(cc,0)
3
c
D(1)
a a (aa,0) b (ba,6) c (ca,3)
b (ab,4) (bb,0) (cab,7)
c (abc,6) (bc,2) (cc,0)
• 从上面的D(1)开始,对于每两个顶点u、v, 在D(1)中存储着一条路径u…v。现在我们 考察,试着把c加到u、v的路径上能否,得 到一条更短的路径,即如果u…c+c…v<u…v 的话,能够找到一条更短的路径。
D(1)
a a (aa,0) b (ba,6) c
b (ab,4) (bb,0) (cab,7)
c (bc,2) (cc,0)
6 a 4
b
2 11
D(0)
a a (aa,0) b (ba,6)
c (ca,3)
b (ab,4) (bb,0)
(cab,7)
c (ac,11) (bc,2)
(百度文库c,0)
3
D(0)
a a (aa,0) b (ba,6) c (ca,3)
b (ab,4) (bb,0)
c (ac,11) (bc,2) (cc,0)
6 a 4
b
2 11
D(-1)
a a (aa,0)
b (ba,6)
b (ab,4)
(bb,0) (cb, ∞)
c (ac,11)
(bc,2) (cc,0)
3
c
b (ba,6)
b (ab,4)
(bb,0) (cb, ∞)
c (ac,11)
(bc,2) (cc,0)
3
c
c (ca,3)
D(0)
a a (aa,0) b (ba,6) c (ca,3)
b (ab,4) (bb,0) (cab,7)
c (ac,11) (bc,2) (cc,0)
• 从上面的D(0)开始,对于每两个顶点u、v, 在D(0)中存储着一条路径u…v。现在我们 考察,试着把b加到u、v的路径上能否,得 到一条更短的路径,即如果 u…b+b…v<u…v的话,能够找到一条更短 的路径。
相关文档
最新文档