其他分享
首页 > 其他分享> > POJ3259 Wormholes

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