Time Limit:10000MS Memory Limit:65536K
Total Submit:351 Accepted:132
Case Time Limit:1000MS
Description
设有
个城市,依次编号为
,另外有一个文件保存
个城市之间的距离(每座城市之间的距离都小于等于
)。当两城市之间的距离等于
时,表示这两个城市没有直接连接。求指定城市
到每一个城市
的最短距离。
Input
第一行有两个整数
和
,中间用空格隔开;以下是一个
的矩阵,表示城市间的距离,数据间用空格隔开。
Output
输出指定城市 到各城市间的距离(从第 座城市开始,中间用空格分开)
Sample Input
3 1
0 3 1
3 0 2
1 2 0
Sample Output
3 0 2
解题思路
这题的数据不太大,可以像 懒惰的 我一样直接用 Floyed-Warshal(就是那个
三方的)。但我还是WA了二十分钟,这道题有很多坑,让我来列举一下。。。(可能只是我傻逼)
- 城市是从 开始的。。。
- 一开始负最大值时不能负 0X7FFFFFFF , 因为在松弛时会超范围。。。(自己理解)
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int INF=1000000000;
int n,k,dis[500],v[500],f[500][500];
int main(){
cin>>n>>k;
memset(dis,0X7f,sizeof(dis));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int a;
cin>>a;
if(a!=-1)
f[i][j]=a;
else
f[i][j]=INF;
}
}
for (int t = 1; t <= n; t++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if ((i != j) && (i != t) && (j != t) && (f[i][t]+f[t][j] < f[i][j]))
f[i][j] = f[i][t] + f[t][j];
for(int i=1;i<=n;i++)
cout<<f[k+1][i]<<" ";
}