zoukankan      html  css  js  c++  java
  • poj 3259 Wormholes 【SPFA&&推断负环】

    Wormholes
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 36852   Accepted: 13502

    Description

    While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.

    As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .

    To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.

    Input

    Line 1: A single integer, F. F farm descriptions follow.
    Line 1 of each farm: Three space-separated integers respectively: N, M, and W
    Lines 2..M+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path.
    Lines M+2..M+W+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.

    Output

    Lines 1..F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).

    Sample Input

    2
    3 3 1
    1 2 2
    1 3 4
    2 3 1
    3 1 3
    3 2 1
    1 2 3
    2 3 4
    3 1 8

    Sample Output

    NO
    YES

    Hint

    分析:

    英语不好。就不在翻译了。

    意思就是求最短路。假设最短路中有负环,输出yes,没有输出no。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #include<cstdlib>
    #define INF 0x3f3f3f3f
    #define maxn 10010
    using namespace std;
    
    int N,M,W;
    int pnum;
    int dis[maxn];
    int vis[maxn];
    int head[maxn];
    int used[maxn];
    bool cnt;
    struct node{
        int from;
        int to;
        int val;
        int next;
    };
    node pp[2*maxn];
    
    void addpp(int u,int v,int w)
    {
        node E ={u,v,w,head[u]};
        pp[pnum]=E;
        head[u]=pnum++;
    }
    
    void init()
    {
        int a,b,c;
        while(M--)
        {
            scanf("%d%d%d",&a,&b,&c);
            addpp(a,b,c);
            addpp(b,a,c);
        }
    }
    
    void gmap()
    {
        int a,b,c;
        while(W--)
        {
            scanf("%d%d%d",&a,&b,&c);
            addpp(a,b,-c);
        }
    }
    
    void SPFA(int s)
    {
        queue<int>q;
        memset(dis,INF,sizeof(dis));
        memset(vis,0,sizeof(vis));
        memset(used,0,sizeof(used));
        dis[s]=0;
        vis[s]=1;
        used[s]++;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i!=-1;i=pp[i].next)
            {
                int v=pp[i].to;
                if(dis[v]>dis[u]+pp[i].val)
                {
                    dis[v]=dis[u]+pp[i].val;
                    if(!vis[v])
                    {
    
                       vis[v]=1;
                       q.push(v);
                       used[v]++;
                       if(used[v]>N)
                       {
                         cnt=true;
                         return;
                        }
                    }
                }
            }
        }
    
    }
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--)
        {
            pnum=0;
            cnt=false;
            memset(head,-1,sizeof(head));
            scanf("%d%d%d",&N,&M,&W);
            init();
            gmap();
            SPFA(1);
            if(cnt)
            printf("YES
    ");
            else
            printf("NO
    ");
        }
        return 0;
    }
    
    
    
    
    


     

  • 相关阅读:
    PHP(运算符,语句,函数)
    数据库高级查询
    MySQL数据库常用函数
    mySQL数据库数据查询操作详解
    mySQL数据库设计范式及增删改查操作
    mySQL-创建表
    JavaScript-选项卡
    JavaScript做DIV下拉列表
    JavaScript-事件
    JavaScript函数-递归
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6905872.html
Copyright © 2011-2022 走看看