1. 程式人生 > >[poj3259]Wormholes(spfa判負環)

[poj3259]Wormholes(spfa判負環)

隊列 spfa算法 oid math num nbsp poj3259 pre ash

題意:有向圖判負環。

解題關鍵:spfa算法+hash判負圈。

負圈是指圈上的總和小於0

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxm=11111;
const int
maxn=500; int head[maxn],tot,n,m,num[maxn],w; struct edge{ int to; int w; int nxt; }e[maxm]; void add_edge(int u,int v,int w){ e[tot].w=w; e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } bool vis[maxn]; queue<int>que;//隊列是點的隊列 int d[maxn]; bool spfa(int
s){ memset(num,0,sizeof num); fill(d+1,d+n+1,inf); memset(vis,0,sizeof vis); while(!que.empty()) que.pop(); que.push(s); vis[s]=true; d[s]=0; while (!que.empty()){ int u=que.front(); que.pop(); vis[u]=false; for (int i=head[u];i!=-1
;i=e[i].nxt){ int v=e[i].to; int w=e[i].w; if (d[v]>d[u]+w){ d[v]=d[u]+w; if (!vis[v]){ vis[v]=true; que.push(v);//hash一下,可判斷是否存在負環 num[v]++; if(num[v]>n) return true; } } } } return false; } int main(){ ios::sync_with_stdio(0); int a,b,c,T; cin>>T; while(T--){ tot=0; memset(head,-1,sizeof head); cin>>n>>m>>w; for(int i=0;i<m;i++){//註意為雙向邊 cin>>a>>b>>c; add_edge(a,b,c); add_edge(b,a,c); } for(int i=0;i<w;i++){ cin>>a>>b>>c; add_edge(a,b,-c); } if(spfa()) puts("YES"); else puts("NO"); } return 0; }

[poj3259]Wormholes(spfa判負環)