城市问题(Floyed-Warsha)

Time Limit:10000MS Memory Limit:65536K
Total Submit:351 Accepted:132
Case Time Limit:1000MS


Description
  设有 n n 个城市,依次编号为 0 1 2 n 1 n < = 100 0,1,2,……,n-1(n<=100) ,另外有一个文件保存 n n 个城市之间的距离(每座城市之间的距离都小于等于 1000 1000 )。当两城市之间的距离等于 1 -1 时,表示这两个城市没有直接连接。求指定城市 k k 到每一个城市 i 0 < = I , k < = n 1 i(0<=I,k<=n-1) 的最短距离。


Input
第一行有两个整数 n n k k ,中间用空格隔开;以下是一个 N x N NxN 的矩阵,表示城市间的距离,数据间用空格隔开。

Output

输出指定城市 k k 到各城市间的距离(从第 0 0 座城市开始,中间用空格分开)


Sample Input
3 1
0 3 1
3 0 2
1 2 0

Sample Output
3 0 2


解题思路

这题的数据不太大,可以像 懒惰的 我一样直接用 Floyed-Warshal(就是那个 n n 三方的)。但我还是WA了二十分钟,这道题有很多坑,让我来列举一下。。。(可能只是我傻逼)

  • 城市是从 0 0 开始的。。。
  • 一开始负最大值时不能负 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]<<" ";
}
发布了73 篇原创文章 · 获赞 5 · 访问量 1837

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/103992040