试题描述
|
放假了,我们的HYF(邹忌)同学准备去一些城市旅游,有些城市有公路,有些则没有。为了节省经费以及方便计划旅程,邹忌希望在出发前知道任意两个城市之间的最短路。
|
输入
|
第一行,包含一个正整数n,表示有n个城市。接下来n行,每行有n个数,一个n*n的矩阵mat,其中mat[i][j]表示城市i到城市j的距离。若mat[i][j]=-1,表示城市i与j没有公路
|
输出
|
n行,每行有n个数,一个n*n的矩阵mat,其中mat[i][j]表示城市i到城市j的最短距离。
|
输入示例
|
4
0 2 6 4 -1 0 3 -1 7 -1 0 1 5 -1 12 0 |
输出示例
|
0 2 5 4
9 0 3 4 6 8 0 1 5 7 10 0 |
其他说明
|
n<=200
|
最最经典的Floyd例题。最短路径中比较好理解的一种,就是时间复杂度较高。
适用于多源最短路(多个起点)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //Floyd 2 #include <iostream> 3 4 using namespace std; 5 int mat[201][201]; 6 int main() 7 { 8 int n; 9 scanf("%d",&n); 10 for(int i=1;i<=n;i++) 11 for(int j=1;j<=n;j++) 12 { 13 scanf("%d",&mat[i][j]); 14 if(mat[i][j]==-1) mat[i][j]=99999999; //正无穷,具体大小因题而异(也别太大,注意两个相加后爆掉,变成负数) 15 } 16 for(int k=1;k<=n;k++) 17 for(int i=1;i<=n;i++) 18 for(int j=1;j<=n;j++) mat[i][j]=min(mat[i][j],mat[i][k]+mat[k][j]); 19 for(int i=1;i<=n;i++) 20 { 21 for(int j=1;j<=n;j++) 22 { 23 if(j==1) printf("%d",mat[i][j]); 24 else printf(" %d",mat[i][j]); 25 } 26 printf(" "); 27 } 28 //system("pause"); 29 return 0; 30 }