文中代码如下:
#include <iostream> #include <cstdio> using namespace std; int e[10][10]; int main() { int k,i,j,n,m,t1,t2,t3; int inf=99999999; //用inf存储一个我们认为的正无穷值 cin>>n>>m; //读入n和m,n表示顶点个数,m表示边的条数 //初始化数组,其实就是初始化城市之间的路程 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) e[i][j]=0;//i==j表示同一个城市 else e[i][j]=inf;// //读入边(权值) for(i=1;i<=m;i++) { cin>>t1>>t2>>t3; //t1、t2表示城市,t3表示两城市之间的路程 e[t1][t2]=t3; //两城市之间最初的值 } //经过第1个点中转 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][1]+e[1][j] ) e[i][j]=e[i][1]+e[1][j]; for(i=1;i<=n;i++) //再经过第2个点中转 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][2]+e[2][j] ) e[i][j]=e[i][2]+e[2][j]; //再经过第3个点中转 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][3]+e[33][j] ) e[i][j]=e[i][3]+e[3][j]; //再经过第4个点中转 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][4]+e[4][j] ) e[i][j]=e[i][4]+e[4][j]; /*//我们把上面经过1、2、3、4点代码整理一下,便写出了Floyd-Warshall的算法核心语句 //它的时间复杂度是O(N3)。令人很震撼的是它竟然只有五行代码,实现起来非常容易。 //如果时间复杂度要求不高,使用Floyd-Warshall来求指定两点之间的最短路或者 //指定一个点到其余各个顶点的最短路径也是可行的。 for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][k]+e[k][j] ) e[i][j]=e[i][k]+e[k][j]; */ /*有一点需要注意的是:如何表示正无穷。我们通常将正无穷定义为99999999, 因为这样即使两个正无穷相加,其和仍然不超过int类型的范围 (C语言int类型可以存储的最大正整数是2147483647)。 在实际应用中最好估计一下最短路径的上限,只需要设置比它大一点既可以。 例如有100条边,每条边不超过100的话,只需将正无穷设置为10001即可。 如果你认为正无穷和其它值相加得到一个大于正无穷的数是不被允许的话, 我们只需在比较的时候加两个判断条件就可以了,请注意下面代码中的语句。 */ /*//Floyd-Warshall算法核心语句 for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][k]<inf && e[k][j]<inf && e[i][j]>e[i][k]+e[k][j]) e[i][j]=e[i][k]+e[k][j]; */ //输出最终的结果,是一个矩阵图 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cout<<e[i][j]<<" "; } cout<<endl; } return 0; }