poj 3259 Wormholes【spfa判负环】

来源:互联网 发布:php微商城 编辑:程序博客网 时间:2024/05/17 00:58


点击打开链接


题意:  给你个地图,很多条双向的路走着费时间, 然还有单向的虫洞返回时间,

问你能不能到达某个点时候时间比之前到达这个点时候之前,从而遇见之前的自己,达到时光旅行。


题解:

    跑spfa 判断 负环就行。。 我现场竟然拿着floyd 狂怼几发, 都te 不过最后硬是floyd 怼过了。


floyd:

#include<iostream>#include<string>#include<stdio.h>#include<string.h>#include<map>#include<set>#include<queue>#include<math.h>#include<algorithm>#define ll long longusing namespace std;const int maxn=555;const int maxm=1e5+100;const int inf = 5000001;int dis[maxn][maxn];int n,m,w,T,a,b,val,ans;int floyd(){    for(int k=1;k<=n;++k){        for(int i=1;i<=n;++i){            for(int j=1;j<=n;++j){                if(dis[i][k]+dis[k][j]<dis[i][j]){                    dis[i][j]=dis[i][k]+dis[k][j];                    if(dis[i][i]<0) return 1;                }            }        }    }    return 0;}int main(){    scanf("%d",&T);    while(T--){        scanf("%d %d %d",&n,&m,&w);        for(int i=1;i<=n;++i){            dis[i][i]=0;            for(int j=i+1;j<=n;++j) dis[i][j]=dis[j][i]=inf;        }        for(int i=1;i<=m;++i){            scanf("%d %d %d",&a,&b,&val);            if(val<dis[a][b]) dis[a][b]=dis[b][a]=val;        }        for(int i=1;i<=w;++i){            scanf("%d %d %d",&a,&b,&val);            dis[a][b]=-val;        }        int ans=floyd();        if(ans)printf("YES\n");        else printf("NO\n");    }    return 0;}

spfa:

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>using namespace std;const int inf=0xffffff;const int maxn=505;struct node{    int to,w,nxt;}edge[maxn*maxn];int n,m,w,T,cnt;int head[maxn];int dis[maxn];int v[maxn];int out[maxn];void addedge(int x,int y,int val){    edge[++cnt].to=y;    edge[cnt].w=val;    edge[cnt].nxt=head[x];    head[x]=cnt;}int spfa(int s){    for(int i=0;i<=n;++i) dis[i]=inf;    memset(v,0,sizeof(v));    memset(out,0,sizeof(out));    queue<int>que;    que.push(s);    dis[s]=0;    while(!que.empty()){        int u=que.front();        que.pop();        out[u]++;v[u]=0;        if(out[u]>n) return 1;        for(int i=head[u];i!=-1;i=edge[i].nxt){            int vv=edge[i].to;            if(dis[vv]>dis[u]+edge[i].w){                dis[vv]=dis[u]+edge[i].w;                if(!v[vv]){                    v[vv]=1;                    que.push(vv);                }            }        }    }    return 0;}int main(){    int a,b,c;    scanf("%d",&T);    while(T--){        cnt=0;        memset(head,-1,sizeof(head));        scanf("%d %d %d",&n,&m,&w);        while(m--){            scanf("%d %d %d",&a,&b,&c);            addedge(a,b,c);            addedge(b,a,c);        }        while(w--){            scanf("%d %d %d",&a,&b,&c);            addedge(a,b,-c);        }        if(spfa(n))printf("YES\n");        else printf("NO\n");    }    return 0;}


0 0
原创粉丝点击