现在的位置: 首页 > 综合 > 正文

poj 3259 Wormholes

2014年10月06日 ⁄ 综合 ⁄ 共 2348字 ⁄ 字号 评论关闭

这道题是是求是否存在负权环。

题意 : 一个famer有一些农场,这些农场里面有一些田地,田地里面有一些虫洞,田地和田地之间有路,虫洞有这样的性质: 时间倒流。问你这个农民能不能看到他自己,也就是说,有没有这样一条路径,能利用虫洞的时间倒流的性质,让这个人能在这个点出发前回去,这样他就是能看到他自己
解题思路:使用Bellman-Ford算法,看图中有没有负权环。有的话就是可以,没有的话就是不可以了。

 

Wormholes
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 20953   Accepted: 7447

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
 
代码:
#include<iostream>
using namespace std;
struct node
{
  int u,v,w;
}edge[6000];
int dis[505];
int n,m,w,index;
const int inf=0x7ffffff;
void add(int u,int v,int c)
{
        index++;
        edge[index].u=u;
        edge[index].v=v;
        edge[index].w=c;
}
bool bellman()
{
   int u,v,w,i,j,flag;
   for(i=1;i<=n;i++)
   {
      dis[i]=inf;
   }
   dis[1]=0;flag=0;
   for(i=1;i<=n;i++)
   {
     for(j=1;j<=index;j++)
     {
       if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
       {
          dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
       }
     }
   }
    for(i=1;i<=index;i++)
      if(dis[edge[i].v]>dis[edge[i].u]+edge[i].w) return true;
    return false;
}
int main()
{
    int i,j,t,u,v,c;
    scanf("%d",&t);
    while(t--)
    {
      scanf("%d%d%d",&n,&m,&w);
      index=0;
      for(i=0;i<m;i++)
      {
        scanf("%d%d%d",&u,&v,&c);
        add(u,v,c);
        add(v,u,c);
      }
      for(i=0;i<w;i++)
      {
       scanf("%d%d%d",&u,&v,&c);
       add(u,v,-1*c);
      }
      if(bellman()) printf("YES\n");
      else printf("NO\n");
    } 
    return 0;
}
      
      

抱歉!评论已关闭.