Wormholes (弗洛伊德 )

来源:互联网 发布:蓝牙连接软件 编辑:程序博客网 时间:2024/06/07 03:57

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

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

Sample Input
23 3 11 2 21 3 42 3 13 1 33 2 11 2 32 3 43 1 8

Sample Output
NOYES

题目大概:

几个农场之间,有双向通道(正权值),有单向通道(负权值),找出其中是否有负权回路。

思路:

用弗洛伊德算法。

代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,m,h;int dis[6000];int s=0;struct point{    int l,r,shu;}a[6000];int fin(){    dis[1]=0;    for(int i=1;i<n-1;i++)    {        for(int j=1;j<=s;j++)        {            if(dis[a[j].r]>dis[a[j].l]+a[j].shu)            dis[a[j].r]=dis[a[j].l]+a[j].shu;        }    }    for(int j=1;j<=s;j++)    if(dis[a[j].r]>dis[a[j].l]+a[j].shu)return 0;    return 1;}int main(){    int t;    cin>>t;    for(int i=1;i<=t;i++)    {    memset(dis,10003,sizeof(dis));    memset(a,0,sizeof(a));         s=0;         cin>>n>>m>>h;         for(int j=1;j<=m;j++)         {int z1,z2,z3;          cin>>z1>>z2>>z3;         a[++s].l=z1;         a[s].r=z2;         a[s].shu=z3;         a[++s].l=z2;         a[s].r=z1;         a[s].shu=z3;        }         for(int j=1;j<=h;j++)         {int z1,z2,z3;          cin>>z1>>z2>>z3;          a[++s].l=z1;         a[s].r=z2;         a[s].shu=-z3;         }         int pp=fin();         if(pp==1)cout<<"NO"<<endl;         else cout<<"YES"<<endl;    }    return 0;}


原创粉丝点击