1. 程式人生 > 其它 >poj 3259 Wormholes spfa判負環

poj 3259 Wormholes spfa判負環

#第一以為是直接傳送看貝西會不會無限迴圈那道題,直接洛谷搬過來交了一發,wa了

哦,不是,是時間旅行者JOHN.

#建圖+判負環

蟲洞單向邊,權值為負;

路徑雙向邊,權值為正;

#判負環的條件是入隊次數>n

---

坑點:

聽說poj的評測機菜到動用min不行要手寫if;

還聽說連三目運算都會被卡;

我的坑點是老把dis[]裡面的那個字母寫成列舉邊時的i,寫嗨了手就殘了..

#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include 
<map> #include <queue> #include <stdio.h> #include <algorithm> #include <cstdio> using namespace std; int n,m,w,flag=0,t=0,vis[10000],dis[10000],head[10000],cnt[10000]; struct node{ int to,val,next; }edge[10000]; void add(int a,int b,int cost) { t++; edge[t].next=head[a]; edge[t].to
=b; edge[t].val=cost; head[a]=t; } void unit( ) { flag=0; t=0; memset(head,0,sizeof(head)); memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); } queue<int>q; int main( ) { // freopen("lys.in","r",stdin); int t; cin>>t; while(t--) { cin
>>n>>m>>w; //cout<<n<<m<<w<<endl; unit( ); for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,c); } for(int i=1;i<=w;i++) { int a,b,c; cin>>a>>b>>c; add(a,b,-c); } memset(dis,0x3f3f3f,sizeof(dis)); vis[1]=1; dis[1]=0; q.push(1); while(!q.empty()) { int now=q.front(); vis[now]=0; cnt[now]++; q.pop( ); if(cnt[now]>n) { flag=1;break; } for(int i=head[now];i;i=edge[i].next) { int to=edge[i].to; if(dis[to]>dis[now]+edge[i].val) { dis[to]=dis[now]+edge[i].val; if(vis[to]==0) { vis[to]=1; q.push(to); } } } } if(flag) { cout<<"YES"<<endl; } else cout<<"NO"<<endl; } }