1084. Travel

题目描述

小Q非常喜欢在自己的国家旅行。小Q所在的国家有N座城市,分别编号为1~n,小Q所在的城市编号为1。小Q现在想知道从他所在的城市出发,到其他N-1个城市的最短路程分别是多少?

输入

第一行两个整数N,M(1<=n<=1000,1<=M<=100000),分别表示小Q所在的国家有N座城市以及城市间有M条单向道路。
接下来M行,每行三个整数x,y,len(1<=x,y<=n,1<=len<=100000)表示从城市x去到城市y需要走len这么多路程。
输入可能存在重边

输出

一共N-1行,每行一个整数,第i个整数表示小Q从城市1到城市(i+1)的最短路程。如果不能到达输出-1

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define maxint 2139062143
using namespace std;
int a[1010][1010],dist[100010],n;
void spfa(int s)
{
	int q[100010],v[100010],h = 0,t = 0,x,i;
	memset(q,0,sizeof(q));
	memset(v,0,sizeof(v));
	memset(dist,127,sizeof(dist));
	dist[s] = 0;
	q[t++] = s;
	v[s] = 1;
	while(h != t)
	{
        x = q[h++];
		v[x] = 0;
		for(i = 1;i <= n;i++)
		{
			if(dist[i] - a[x][i] > dist[x])
			{
				dist[i] = dist[x] + a[x][i];
				if(!v[i])
				{
					q[t++] = i;
					v[i] = 1;
				}
			}
		}
	}
}
int main()
{
	int m;
	scanf("%d%d",&n,&m);
	memset(a,127,sizeof(a));
	for(register int i = 1;i <= m;i++)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		a[x][y] = min(a[x][y],z);
	}
	spfa(1);
	for(register int i = 2;i <= n;i++)
		printf("%d\n",dist[i] == 0x3f3f3f3f ? -1 : dist[i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40155097/article/details/95314335
今日推荐