城市问题 题解

城市问题

题目

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

输入

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

输出

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

样例

input
3 1
0 3 1
3 0 2
1 2 0

output
3 0 2

解题思路

Dijkstra算法
找到每一次剩下路径中最短的路径
改变它的状态
更新与它相连的点的最短路径

代码

#include
#include
#include
#include
using namespace std;
const int maxn=0x7fffffff;
int a[120][120],dis[120],p[120],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",&a[i][j]);
	memset(dis,0x7f,sizeof(dis));
	dis[k]=0;
	for (int i=1;i<=n;i++)
	{
		int k=0,mi=maxn;
		for (int j=1;j<=n;j++)
		    if (p[j]==0&&dis[j]<mi)  //找到剩下的路径中最短的
		    {
		    	mi=dis[j];
		    	k=j;
		    }
		p[k]=1;  //变白点
		for (int j=1;j<=n;j++)
		    if (a[j][k]!=-1&&p[j]==0)  //更新与它相连的点的最短路径
		       dis[j]=min(dis[j],dis[k]+a[j][k]); 
	}
	for (int i=1;i<=n;i++)
	    cout<<dis[i]<<" ";
	return 0;
} 

你可能感兴趣的:(最短路)