floyd

求任意两点之间的最短路径。e[i][j]为记录从i到j之间的距离,当循环结束后最后存储的就是i到j之间的最短路径啦。

floyd算法就是对于给定的n个结点,对于每一个e[i][j],都让它经过1,然后比较e[i][j]和e[i][1]+e[1][j]的大小,来更新e[i][j],再用2依次比较一下,同理,一直到n个结点都比较一次,所以就成了3层循环。但是我们要注意一下,floyd算法不适合带有负权值的问题,因为当存在负权值的时候就会一直循环下去,找不到最小值。而且效率有些低。。。。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 const int inf=0x3f3f3f;
 7 int e[1004][1004];
 8 int main(){
 9 int m,n;
10 while(cin>>n>>m){
11         for(int i=1;i<=n;i++){
12             for(int j=1;j<=n;j++){
13                 if(i==j)e[i][j]=0;
14                     else
15                 e[i][j]=inf;
16             }
17         }
18         int t1,t2,t3;
19     for(int i=1;i<=m;i++){
20         cin>>t1>>t2>>t3;
21         e[t1][t2]=t3;
22     }
23     for(int k=1;k<=n;k++)///要经过的结点
24     for(int i=1;i<=n;i++)
25         for(int j=1;j<=n;j++)
26             if(e[i][j]>e[i][k]+e[k][j])e[i][j]=e[i][k]+e[k][j];///更新结点
27 for(int i=1;i<=n;i++){
28     for(int j=1;j<=n;j++){
29     printf("%10d",e[i][j]);
30     }
31     cout<<endl;}
32 }
33 }
View Code
你若盛开,清风自来...
原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5866069.html