#P2416. 2416 - 最短路和负环

2416 - 最短路和负环

题目描述

给出一个有 NN 个节点, MM 条边的带权有向图。

要求你写一个程序, 判断这个有向图中是否存在负权回路。 如果从一个点沿着某条路径出发, 又回到了自己, 而且所经过的边上的权和小于 00 , 就说这条路是一个负权回路。如果存在负权回路, 只输出一行 1-1

如果不存在负权回路, 再求出一个点 SS (1SN1≤S≤N)到每个点的最短路的长度。 约定: SSSS 的距离为 00 , 如果 SS 与这个点不连通, 则输出NoPath

输入

第一行:点数 NN (2N10002≤N≤1000),边数 MM (1M10001≤M≤1000),源点 SS (1SN1≤S≤N);

以下 MM 行, 每行三个整数 aa, bb, cc 表示点 aa, bb(1a,bN1≤a, b≤N)之间连有一条边, 权值为 cc (1,000,000c1,000,000-1,000,000≤c≤1,000,000)
请注意:本题两点之间可能存在多条边。

输出

如果存在负权环, 只输出一行 1-1

如果不存在负环,请按如下要求输出:

NN 行, 第 ii 行描述 SS 点到 ii 点的最短路:

如果 SSii 不连通, 输出NoPath;

如果 i=Si = S, 输出 00;

其他情况输出 SSii 的最短路的长度。

样例

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