题意简介
因为要回到过去,所以回到起点时是一个负数。所以,就是求负环的问题了。
输入浅析
输入,就是说,有很多无向边,还有一些虫洞在单向边上,这些单向边为负权。
算法分析
算法的话,判负环有3 kinds of algorithm : SPFA, Bellman-Ford and Floyd。看这道题的神奇数据范围,三种是都可以用的。
等一下,不是多源负环吗?怎么能用SPFA呢?不要急,等一下再说。
Floyd
老师:在循环体足够简单的情况下, O ( 50 0 3 ) O(500^3) O(5003)是可以过的…… 看来老师很擅长卡常+O2啊
因为代码极简单,直接看吧。
还有,记住,有重边……
// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#define reg register
#define ONLINE_JUDGE
#ifdef ONLINE_JUDGE
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int getc() {
return p1 == p2 && (++p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
#define getchar getc
#endif
template <typename T>
inline T read() {
T a = 0; char c = getchar(), f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -f;
if(c == -1) return c;
c = getchar();
}
while(c >= '0' && c <= '9') a = (a << 1) + (a << 3) + (c ^ 48), c = getchar();
return a * f;
}
template <class T>
inline T Min(T a, T b) {
return a