zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    js 学习的地址;
    HTML onmousedown 事件属性 关于鼠标按键的问题;
    contextmenu="supermenu" 属性的应用 右键菜单打开和保存功能
    gulp自动化ES6转ES5
    angularjs获取元素以及angular.element()用法
    gulp学习总结
    Git 代码管理常用命令
    SpringMVC基于代码的配置方式(零配置,无web.xml)
    [Android Studio 权威教程]AS 中配置强大的版本号管理系统(Git、SVN、等)
    SVM支持向量机
  • 原文地址:https://www.cnblogs.com/doubleshik/p/3541857.html
Copyright © 2011-2022 走看看