1084トラベル

タイトル説明

Qは、自分の国に旅行するのが好き、非常に小さいです。Nの都市があるQ小さな国は、Q小都市数1、N〜1の番号が付け。小さなQは、それぞれ出発の彼の都市、他のN-1都市への最短距離から知りたいですか?

エントリー

二つの整数の最初のラインN、M(1 <= N <= 1000,1 <= M <= 100000)、 Qが単方向経路と小さな国を表し、それぞれ、都市および都市間のM Nがあります。
次のM行、三つの整数X、Y、LEN(1 <の各行 =は、X、Y <= N、1 <= LEN <= 100000) 都市から都市xとyに表すはるかに距離LENに行く必要があります。
複数のエッジ入力があるかもしれません

輸出

N-1行の合計は、それぞれ整数で、i番目の小Qは、都市へ1つの都市から整数の最小距離(I + 1)を表します。出力が届かない場合は-1

コード

#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