#420. Easy SSSP

Easy SSSP

题目描述

原题来自:[Vijos P1053]

输入数据给出一个有 N\red{N} 个节点,M\red{M }条边的带权有向图。要求你写一个程序,判断这个有向图中是否存在负权回路。如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于 0\red{0},就说这条路是一个负权回路。

如果存在负权回路,只输出一行1\red{ -1};如果不存在负权回路,再求出一个点 S\red{S} 到每个点的最短路的长度。约定:S\red{S}S\red{S }的距离为0\red{ 0},如果 S\red{S }与这个点不连通,则输出 NoPath

输入格式

第一行三个正整数,分别为点数N\red{ N},边数 M\red{M},源点 S\red{S}

以下M\red{ M} 行,每行三个整数a,b,c\red{ a,b,c},表示点a,b\red{ a,b} 之间连有一条边,权值为 c\red{c}

输出格式

如果存在负权环,只输出一行 1\red{-1},否则按以下格式输出:

N\red{N }行,第 i\red{i} 行描述S\red{ S }点到点i\red{ i} 的最短路:

如果 S\red{S }i\red{ i }不连通,输出 NoPath; 如果 i=S\red{i=S},输出 0\red{0}。 其他情况输出S\red{ S }i\red{i }的最短路的长度。

样例

输入样例

6 8 1
1 3 4
1 2 6
3 4 -7
6 4 2
2 4 5
3 6 3
4 5 1
3 5 4

输出样例

0
6
4
-3
-2
7

提示

对于全部数据,2N100,1M105,1a,b,SN,c106\red{2\le N\le 100,1\le M\le 10^5,1\le a,b,S\le N,|c|\le 10^6}