POJ-3259Wormholes

来源:互联网 发布:mac osx命令行 编辑:程序博客网 时间:2024/06/09 15:22

真是被自己蠢哭了。

为毛spfa判断负环要每个节点都判断一次啊。一次不就可以了啊啊啊啊啊啊,真是蠢。

还有因为是判断负环。所以有重边也无所谓,无所谓!!!!!

别看到重边就被别人牵着鼻子走!!!!


写了判断重边的方法.


Code

#include <iostream>    #include <map>    #include <algorithm>    #include <cstdio>    #include <cstring>    #include <cstdlib>    #include <vector>    #include <queue>    #include <stack>    #include <functional>    #include <set>    #include<sstream>#include <cmath>    using namespace std;    #define pb push_back    #define PB pop_back    #define bk back()    #define fs first    #define se second  #define INF 1001000 #define sq(x) (x)*(x)    #define eps (1e-10)     #define clr(x) memset((x),0,sizeof (x))    #define cp(a,b) memcpy((a),(b),sizeof (b))         typedef long long ll;    typedef unsigned long long ull;    typedef pair<int,int> P;  const int maxn=1010;vector<pair<int,int> > G[maxn];int dist[maxn];int vis[maxn];int num[maxn];int N,M,W,S,E,T;int spfa(int s){for(int i=1;i<=N;i++) dist[i]=INF;clr(num);clr(vis);dist[s]=0;queue<int> q;q.push(s);++num[s];while(!q.empty()){int now=q.front();q.pop();vis[now]=0;for(int i=0;i<G[now].size();i++){int nxt=G[now][i].fs;if(dist[nxt]>dist[now]+G[now][i].se){dist[nxt]=dist[now]+G[now][i].se;if(!vis[nxt]){q.push(nxt);vis[nxt]=1;}if(++num[nxt]>N-1){return 0;}}}}return 1;}int main(){int F;scanf("%d",&F);while(F--){scanf("%d%d%d",&N,&M,&W);for(int i=1;i<=N;i++) G[i].clear();for(int i=1;i<=M;i++){scanf("%d%d%d",&S,&E,&T);if(G[S].size()==0)            {              G[S].pb(make_pair(E,T));              G[E].pb(make_pair(S,T));            }            else            {            int tmp=0;            for(int j=0;j<G[S].size();j++)            {            if(G[S][j].fs==E)            {            if(G[S][j].se>T)            G[S][j].se=T;            tmp=1;            break;            }            }            if(tmp)            {            for(int j=0;j<G[S].size();j++)            {            if(G[E][j].fs==S&&G[E][j].se>T)            {            G[E][j].se=T;            break;            }            }            }            else            {            G[S].pb(make_pair(E,T));            G[E].pb(make_pair(S,T));            }            }}for(int i=1;i<=W;i++){scanf("%d%d%d",&S,&E,&T);int tmp=0;for(int j=0;j<G[S].size();j++){if(G[S][j].fs==E){tmp=1;if(G[S][j].se>-T) G[S][j].se=-T;                    break;}}if(!tmp)G[S].pb(make_pair(E,-T));}if(spfa(N)) printf("NO\n");else     printf("YES\n");}return 0;}


0 0
原创粉丝点击