• poj3259 Wormholes(spfa)


    就是给出一些点边关系, 有虫洞的就是负值。 注意普通道路是双向边。。一开始这里建错图了

    之后处理用了spfa ,类似模板的一道题

    题目:

    Wormholes
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 26848   Accepted: 9669

    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

    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.

    Source

     
     
    代码:
     1 #include <iostream>
     2 #include <vector>
     3 #include <cstring>
     4 #include <queue>
     5 #include <cstdio>
     6 using namespace std;
     7 #define LEN  500+10
     8 #define INF 10000*501
     9 #define MP(x,y) make_pair(x,y)
    10 typedef pair<int,int> pii;
    11 
    12 vector<pii> G[LEN];
    13 int N,M,W;
    14 int dis[LEN];
    15 void init()
    16 {
    17     cin>>N>>M>>W;
    18     for(int i=1;i<=N;i++)
    19         G[i].clear();
    20 
    21     int s,e,t;
    22     for(int i=0;i<M;i++)
    23     {
    24         cin>>s>>e>>t;
    25         G[s].push_back( MP(e,t));
    26         G[e].push_back( MP(s,t));
    27     }
    28     for(int i=0;i<W;i++)
    29     {
    30         cin>>s>>e>>t;
    31         G[s].push_back( MP(e,-t));
    32     }
    33 }
    34 
    35 bool spfa(int s)
    36 {
    37     queue<int> q;
    38     int vis[LEN] = {0}, cnt[LEN] ={0};
    39     for(int i=1;i<=N;i++)dis[i] = INF;
    40 
    41     dis[s]=0;
    42     q.push(s);
    43     vis[s] = 1;
    44     cnt[s]++;
    45 
    46     while(!q.empty())
    47     {
    48         int v = q.front(); q.pop();
    49         for(int i=0;i<G[v].size();i++)
    50         {
    51             int  x = G[v][i].first , d = G[v][i].second;
    52 
    53             if( dis[x] > dis[v]+ d)
    54             {
    55                 dis[x] = dis[v]+d;
    56                 if(!vis[x])
    57                 {
    58                     q.push(x);
    59                     vis[x] = 1;
    60                     cnt[x] ++;
    61                     if( cnt[x]>N-1)return true;
    62                 }
    63             }
    64         }
    65         vis[v]= 0;
    66     }
    67     return false;
    68 }
    69 int main()
    70 {
    71     int F;
    72     cin>>F;
    73     while(F--)
    74     {
    75         init();
    76 
    77         if( spfa(1) || dis[1]<0)
    78             cout<<"YES"<<endl;
    79         else
    80             cout<<"NO"<<endl;
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    异步--记录
    css过渡——实现元素的飞入飞出
    使用touch操作图片
    .net mvc中epplus导出excel
    html无卡顿动画实现——requestAnimationFrame
    调用手机摄像头并上传图片--jquery ajax
    jquery form表单赋值封装
    记录
    .net mvc 使用 aspose.cells导出数据
    explain简介
  • 原文地址:https://www.cnblogs.com/doubleshik/p/3541857.html
Copyright © 2020-2023  润新知