【最短路】【图论】【Floyed】城市问题

D e s c r i p t i o n Description

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

I n p u t Input

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

O u t p u t Output

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

S a m p l e I n p u t Sample Input

3 1
0 3 1
3 0 2
1 2 0

S a m p l e O u t p u t Sample Output

3 0 2

T r a i n Train O f Of T h o u g h t Thought

其实这道题就是一个 F l o y e d Floyed 的模板题,只要在读入的时候注意一下 1 -1 的情况就好了

C o d e Code

#include<cstdio>
#include<iostream>
using namespace std;
int f[105][105],n,k;
int main()
{
	scanf("%d%d",&n,&k);
	k++;
	for (int i=1; i<=n; ++i)
	 for (int j=1; j<=n; ++j){
	  scanf("%d",&f[i][j]);
	  if (f[i][j]!=-1) f[j][i]=f[i][j];
	   else f[i][j]=f[j][i]=1e9;//预处理
	}
	f[k][k]=0;
	for (int kk=1; kk<=n; ++kk)
	 for (int i=1; i<=n; ++i)
	  for (int j=1; j<=n; ++j)
	   if (f[i][j]>f[i][kk]+f[kk][j])
	    f[i][j]=f[i][kk]+f[kk][j];//Floyed模板
	for (int i=1; i<=n; ++i)
	 printf("%d ",f[k][i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LTH060226/article/details/88852000