poj 3259 Wormholes spfa判負環
阿新 • • 發佈:2021-10-07
#第一以為是直接傳送看貝西會不會無限迴圈那道題,直接洛谷搬過來交了一發,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; } }