有N个农场,它们之间有M条普通的双向路径,同时有W条单向“虫洞”,通过普通路径需要花费时间,但通过虫洞却可以回到过去。问能否从任意一个点出发,通过某些普通路径或者“虫洞”再回到起始位置,使到达的时间早于出发的时间。
这是带负权的单源最短路径的入门题,按题目给定的边建好图,从任意一点起点开始,使用Bellman-Ford算法运行一遍,判断有没有回路就可以了。
#include <iostream>
#include <cstdio>
#include <climits>
#include <algorithm>
using namespace std;
const int N = 505;
const int E = 5205;
const int MAX = 0xfffffff;
struct Edge
{
int beg;
int end;
int dis;
};
Edge edge[E];
int mindis[N];
int n, e;
bool relax(int beg, int end, int dis)
{
if (mindis[beg] + dis < mindis[end])
{
mindis[end] = mindis[beg] + dis;
return true;
}
return false;
}
bool bellman_ford(int s)
{
bool flag;
for (int i = 0; i < n; ++i) mindis[i] = MAX;
mindis[s] = 0;
for (int i = 0; i < n - 1; ++i)
{
flag = false;
for (int j = 0; j < e; ++