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; } }