POJ3259 Wormholes
作者:互联网
spfa判断负环
题意:John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。总的来说,就是看图中有没有负权环。有的话就是可以,没有的话就是不可以了。(题意来源:https://www.cnblogs.com/lienus/p/4273501.html)
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 5500;
int ver[maxn], edge[maxn], next[maxn], head[505], dis[505], cnt[505];
bool vis[505];
int tot, n;
void Add(int x,int y,int z)
{
ver[++tot] = y, edge[tot] = z, next[tot] = head[x], head[x] = tot;
}
int spfa()
{
queue<int> q;
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
dis[1] = 0; vis[1] = 1;
q.push(1);
while(q.size()){
int x = q.front(); q.pop();
vis[x] = 0;
for(int i = head[x]; i; i = next[i]){
int y = ver[i], z = edge[i];
if(dis[y] > dis[x] + z){
dis[y] = dis[x] + z;
if(!vis[y]){
q.push(y), vis[y] = 1;
cnt[y]++;
if(cnt[y] > n) return 1;
}
}
}
}
return 0;
}
int main()
{
int t; scanf("%d",&t);
int m, w, x, y, z;
while(t--){
tot = 0;
memset(head,0,sizeof(head));
scanf("%d%d%d",&n,&m,&w);
for(int i = 1; i <= m; i++){
scanf("%d%d%d",&x,&y,&z);
Add(x,y,z);
Add(y,x,z);
}
for(int i = 1; i <= w; i++){
scanf("%d%d%d",&x,&y,&z);
Add(x,y,-z);
}
if(spfa()) printf("YES\n");
else printf("NO\n");
}
return 0;
}
标签:head,vis,int,cnt,tot,POJ3259,Wormholes,dis 来源: https://blog.csdn.net/kkjy_00/article/details/87966649