poj3259(spfa判负环)

 

题目连接:http://poj.org/problem?id=3259

题意:John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。总的来说,就是看图中有没有负权环。有的话就是可以,没有的话就是不可以了。

分析:sfa判负环,直接建图套模板即可。

#include <cstdio>

#include <cstring>

#include <string>

#include <cmath>

#include <iostream>

#include <algorithm>

#include <queue>

#include <cstdlib>

#include <stack>

#include <vector>

#include <set>

#include <map>

#define LL long long

#define mod 100000000

#define inf 0x3f3f3f3f

#define eps 1e-9

#define N 3010

#define FILL(a,b) (memset(a,b,sizeof(a)))

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define PII pair<int,int>

using namespace std;

struct edge

{

    int v,w,next;

    edge(){}

    edge(int v,int w,int next):v(v),w(w),next(next){}

}e[N<<1];

int head[N<<1],tot;

int vis[N],cnt[N];

int n,m,s;

int dis[N];

void init()

{

    FILL(vis,0);FILL(head,-1);

    FILL(dis,0x3f);FILL(cnt,0);tot=0;

}

void addedge(int u,int v,int w)

{

    e[tot]=edge(v,w,head[u]);

    head[u]=tot++;

}

int spfa()

{

    queue<int>que;

    vis[1]=1;cnt[1]=1;

    dis[1]=0;que.push(1);

    while(!que.empty())

    {

        int u=que.front();

        que.pop();vis[u]=0;

        for(int i=head[u];~i;i=e[i].next)

        {

            int v=e[i].v,w=e[i].w;

            if(dis[v]>dis[u]+w)

            {

                dis[v]=w+dis[u];

                if(!vis[v])

                {

                    vis[v]=1;

                    cnt[v]++;

                    if(cnt[v]>n)return 1;

                    que.push(v);

                }

            }

        }

    }

    return 0;

}

int main()

{

    int T,u,v,w;

    scanf("%d",&T);

    while(T--)

    {

        scanf("%d%d%d",&n,&m,&s);

        init();

        for(int i=1;i<=m;i++)

        {

            scanf("%d%d%d",&u,&v,&w);

            addedge(u,v,w);

            addedge(v,u,w);

        }

        for(int i=1;i<=s;i++)

        {

            scanf("%d%d%d",&u,&v,&w);

            addedge(u,v,-w);

        }

        if(spfa())puts("YES");

        else puts("NO");

    }

}
View Code

你可能感兴趣的:(SPFA)