zoukankan      html  css  js  c++  java
  • Wormholes

     

    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 36782   Accepted: 13467

    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 toF (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, FF farm descriptions follow.
    Line 1 of each farm: Three space-separated integers respectively: NM, and W 
    Lines 2..M+1 of each farm: Three space-separated numbers (SET) 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,ET) that describe, respectively: A one way path fromS toE 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

    For farm 1, FJ cannot travel back in time. 
    For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this.
    【思路】
    spfa判断负环
    一个点是否加入队列n次以上
    【code】
    #include<queue>
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n,m,w,x,y,z,t;
    struct Edge {
        int x,y,z,nxt;
        Edge(int x=0,int y=0,int z=0,int nxt=0):
            x(x),y(y),z(z),nxt(nxt) {}
    } edge[2500<<1];
    int head[501],sumedge,dis[501],vis[501],cnt[501];
    void fir() {
        sumedge=0;
        memset(head,0,sizeof(head));
        memset(dis,127/2,sizeof(dis));
        memset(vis,0,sizeof(vis));
    }
    int add(int x,int y,int z) {
        edge[++sumedge]=Edge(x,y,z,head[x]);
        return head[x]=sumedge;
    }
    int spfa() {
        queue <int>q;
        dis[1]=0;
        vis[1]=1;
        q.push(1);
        while(!q.empty()) {
            int now=q.front();
            q.pop();
            vis[now]=0;
            ++cnt[now];
            if(cnt[now]>n)return 1;
            for(int i=head[now]; i; i=edge[i].nxt) {
                int to=edge[i].y;
                if(dis[to]>dis[now]+edge[i].z) {
                    dis[to]=dis[now]+edge[i].z;
                    if(!vis[to]) {
                        vis[to]=1;
                        q.push(to);
                    }
                }
            }
        }
        return 0;
    }
    int main() {
        scanf("%d",&t);
        while(t--) {
            fir();
            scanf("%d%d%d",&n,&m,&w);
            for(int i=1; i<=m; i++) {
                scanf("%d%d%d",&x,&y,&z);
                add(x,y,z);
                add(y,x,z);
            }
            for(int i=1; i<=w; i++) {
                scanf("%d%d%d",&x,&y,&z);
                add(x,y,-z);
            }
            if(spfa())
                printf("YES
    ");
            else
                printf("NO
    ");
        }
        return 0;
    }
  • 相关阅读:
    Spring攻略学习笔记(3.00)AOP核心概念和术语
    zoj 3494
    第43周星期五
    findBugs学习小结
    第42周星期日
    Cookie知识小结
    第42周星期三
    第42周星期六
    第43周星期四小结
    第43周星期二
  • 原文地址:https://www.cnblogs.com/zzyh/p/6944940.html
Copyright © 2011-2022 走看看