链接:https://vjudge.net/problem/POJ-3259
题意:
农夫有N(1-500)个农场,有M(1-2500)条无向的路,和W(1-200)个有向的虫洞。
给N,M,W。
在给出M条路径个走过的时间,W个有向虫洞和虫洞可以穿越回之前多久。
求能不能在某一时刻穿越回去看到自己。
思路:
bellman-ford算法,无向路为正权,有向虫洞为负权,当可以产生负权回环时,即可以实现穿越回去看到自己。
代码:
#include <iostream>
#include <memory.h>
using namespace std;
const int MAXN = 6000;
int n,m,w;
int b = 1;
struct Node
{
int l,r;
int v;
}node[MAXN];
int dis[510];
bool bellman_ford()
{
for (int i = 1;i<=n;i++)
dis[i] = 999999;
dis[1] = 0;
for (int i = 1;i <= n-1;i++)
{
bool flag = false;
for (int j = 1;j<b;j++)
{
int l = node[j].l,r = node[j].r,v = node[j].v;
if (dis[r] > dis[l] + v)
{
dis[r] = dis[l] + v;
flag = true;
}
}
if (!flag)
break;
}
for (int i = 1;i<b;i++)
if (dis[node[i].r] > dis[node[i].l] + node[i].v)
return true;
return false;
}
int main()
{
int t;
int l,r,v;
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d",&n,&m,&w);
b = 1;
for (int i = 0;i<m;i++)
{
scanf("%d%d%d",&l,&r,&v);
node[b].l = l;
node[b].r = r;
node[b++].v = v;
node[b].l = r;
node[b].r = l;
node[b++].v = v;
}
for (int i = 0;i<w;i++)
{
scanf("%d%d%d",&l,&r,&v);
node[b].l = l;
node[b].r = r;
node[b++].v = -v;
}
if (bellman_ford())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}