zoukankan      html  css  js  c++  java
  • poj3259

    Wormholes
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 24864   Accepted: 8869

    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, 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
    #include<iostream>
    #include<stdio.h>
    using namespace std;
    const int fMax = 505;
    const int eMax = 5205;
    const int wMax = 99999;
    struct{
        int sta, end, time;
    }edge[eMax];
    int point_num, edge_num, dict[fMax];
    bool bellman_ford()
    {
        int i, j;
        for(i = 2; i <= point_num; i ++)
            dict[i] = wMax;//初始化
        for(i = 1; i < point_num; i ++)//点要减1
    	{
            bool finish = true;    //  加个全部完成松弛的判断,优化了50多MS。 
            for(j = 1; j <= edge_num; j ++)
    		{
                int u = edge[j].sta;
                int v = edge[j].end;
                int w = edge[j].time;
                if(dict[v] > dict[u] + w)
    			{   //  松弛。
                    dict[v] = dict[u] + w;
                    finish = false;
                }
            }
            if(finish)  break;
        }
        for(i = 1; i <= edge_num; i ++)
    	{   //  是否存在负环的判断。
            int u = edge[i].sta;
            int v = edge[i].end;
            int w = edge[i].time;
            if(dict[v] > dict[u] + w) 
    			
                return false;
        }
        return true;
    }
    int main()
    {
        int farm;
        scanf("%d", &farm);
        while(farm --)
    	{
            int field, path, hole;
            scanf("%d %d %d", &field, &path, &hole);
            int s, e, t, i, k = 0;
            for(i = 1; i <= path; i ++)
    		{
                scanf("%d %d %d", &s, &e, &t);  //  用scanf代替了cin,优化了100多MS。
                k ++;
                edge[k].sta = s;
                edge[k].end = e;
                edge[k].time = t;
                k ++;
                edge[k].sta = e;
                edge[k].end = s;
                edge[k].time = t;
            }
            for(i = 1; i <= hole; i ++)
    		{
                scanf("%d %d %d", &s, &e, &t);
                k ++;
                edge[k].sta = s;
                edge[k].end = e;
                edge[k].time = -t;
            }
            point_num = field;
            edge_num = k;
            if(!bellman_ford())  
    			printf("YES
    ");
            else  printf("NO
    ");
    		for(i=0;i<=point_num;i++)
    			printf("%d  ",dict[i]);
        }
        return 0;
    }


  • 相关阅读:
    【leetcode】1215.Stepping Numbers
    【leetcode】1214.Two Sum BSTs
    【leetcode】1213.Intersection of Three Sorted Arrays
    【leetcode】1210. Minimum Moves to Reach Target with Rotations
    【leetcode】1209. Remove All Adjacent Duplicates in String II
    【leetcode】1208. Get Equal Substrings Within Budget
    【leetcode】1207. Unique Number of Occurrences
    【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
    【leetcode】LCP 3. Programmable Robot
    【leetcode】LCP 1. Guess Numbers
  • 原文地址:https://www.cnblogs.com/riskyer/p/3225904.html
Copyright © 2011-2022 走看看