POJ 3259 Wormholes spfa 判负环
Posted shuguangzw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3259 Wormholes spfa 判负环相关的知识,希望对你有一定的参考价值。
#include<cstdio> #include<cstring> #include<queue> #include<cstdlib> #include<algorithm> #include<vector> #include<cmath> using namespace std; typedef long long LL; const int N=5e2+5; const int INF=0x3f3f3f3f; struct Edge{ int v,w,next; }edge[20*N]; int n,m,p,head[N],tot,cnt[N]; bool inq[N]; double d[N],v; queue<int>q; void add(int u,int v,int w){ edge[tot].w=w; edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } bool spfa(int s){ memset(cnt,0,sizeof(cnt)); memset(inq,0,sizeof(inq)); for(int i=1;i<=n;++i)d[i]=INF; d[s]=0,q.push(s),inq[s]=true,cnt[s]=1; while(!q.empty()){ int u=q.front(); q.pop(); inq[u]=false; for(int i=head[u];~i;i=edge[i].next){ int v=edge[i].v; if(d[v]>d[u]+edge[i].w){ d[v]=d[u]+edge[i].w; if(!inq[v]){ inq[v]=true; if(++cnt[v]>n)return true; q.push(v); } } } } return false; } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&p); memset(head,-1,sizeof(head)),tot=0; for(int i=1;i<=m;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w),add(v,u,w); } for(int i=1;i<=p;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,-w); } if(spfa(1))printf("YES\n"); else printf("NO\n"); } }
以上是关于POJ 3259 Wormholes spfa 判负环的主要内容,如果未能解决你的问题,请参考以下文章