题号:NC50386
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld
题目描述
输入数据给出一个有N个节点,M条边的带权有向图。要求你写一个程序,判断这个有向图中是否存在负权回路。如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0,就说这条路是一个负权回路。
如果存在负权回路,只输出一行-1;如果不存在负权回路,再求出一个点S到每个点的最短路的长度。约定:S到S的距离为0,如果S与这个点不连通,则输出NoPath。
输入描述:
第一行三个正整数,分别为点数N,边数M,源点S;
以下M行,每行三个整数a,b,c,表示点a,b之间连有一条边,权值为c。
输出描述:
如果存在负权环,只输出一行-1,否则按以下格式输出:
共N行,第i行描述S点到点i的最短路:
如果S与i不连通,输出NoPath;
如果i=S,输出0。
其他情况输出S到i的最短路的长度。
示例1
输入
复制
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
备注:
对于全部数据,
。