POJ3259——Wormholes

来源:互联网 发布:手机淘宝的淘抢购在哪 编辑:程序博客网 时间:2024/04/28 02:40

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

Wormholes

题目大意:给你n个点,m条双向联通的权值为正的路,和w条单向联通权值为负的路。让你判断是否存在负环。

用队列实现,判断是否存在负环。

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define INF 0xfffffffusing namespace std;const int V=510;const int E=6000;int n,m,w,e;int pnt[E],cost[E],nxt[E];int head[V],dis[V];int vis[V];int cnt[V];int relax(int u,int v,int c){    if(dis[v]>dis[u]+c)    {        dis[v]=dis[u]+c;        return 1;    }    return 0;}inline void addedge(int u,int v,int c){    pnt[e]=v;    cost[e]=c;    nxt[e]=head[u];    head[u]=e++;}int SPFA(int src,int n){    int i;    memset(cnt,0,sizeof(cnt));    memset(vis,0,sizeof(vis));    for(i=1;i<=n;i++)        dis[i]=INF;    dis[src]=0;    queue<int> Q;    Q.push(src);    vis[src]=1;    ++cnt[src];    while(!Q.empty())    {        int u,v;        u=Q.front();        Q.pop();        vis[u]=0;        for(i=head[u];i!=-1;i=nxt[i])        {            v=pnt[i];            if(relax(u,v,cost[i])&&!vis[v])            {                Q.push(v);                vis[v]=1;                if(++cnt[v]>n)                    return -1;            }        }    }    if(dis[n]==INF)        return -2;    return 1;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        int i,a,b,c;        e=0;        memset(head,-1,sizeof(head));        scanf("%d%d%d",&n,&m,&w);        for(i=0;i<m;i++)        {            scanf("%d%d%d",&a,&b,&c);            addedge(a,b,c);            addedge(b,a,c);        }        for(i=0;i<w;i++)        {            scanf("%d%d%d",&a,&b,&c);            addedge(a,b,-c);        }        if(SPFA(1,n)>0)            printf("NO\n");        else            printf("YES\n");    }    return 0;}


0 0
原创粉丝点击