Wormholes
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 36717   Accepted: 13438

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

70ms

#include<iostream>  //79ms
#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 10000000 using namespace std; struct node
{
int u,v,w;
} edge[5500];
int low[5500];
int n,m,z;
int num=0;
int Bellman()
{
for(int i=0; i<=n; i++)
low[i]=INF; for(int i=0; i<n-1; i++)
{
int flag=0;
for(int j=0; j<num; j++)
{
if(low[edge[j].u]+edge[j].w<low[edge[j].v])
{
low[edge[j].v]=low[edge[j].u]+edge[j].w;
flag=1;
}
}
if(flag==0) //存在负权回路
break;
} for(int j=0; j<num; j++) //推断负权回路
{
if(low[edge[j].u]+edge[j].w<low[edge[j].v])
return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&z);
int a,b,c;
num=0;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[num].u=a;
edge[num].v=b;
edge[num++].w=c; edge[num].u=b;
edge[num].v=a;
edge[num++].w=c;
} for(int i=1; i<=z; i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[num].u=a;
edge[num].v=b;
edge[num++].w=-c;
}
if(Bellman())
printf("YES\n");
else
printf("NO\n");
}
}

700ms

#include<iostream>  //挨个点遍历
#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f using namespace std; struct node
{
int u,v,w;
} edge[5500];
int low[550];
int n,m,z;
int num=0;
int Bellman(int u0)
{
for(int i=0; i<=n; i++)
low[i]=INF;
low[u0]=0;
for(int i=0; i<n; i++) //递推n次,让其构成环来推断
{
int flag=0;
for(int j=0; j<num; j++)
{
if(low[edge[j].u]!=INF&&low[edge[j].u]+edge[j].w<low[edge[j].v])
{
low[edge[j].v]=low[edge[j].u]+edge[j].w;
flag=1;
}
}
if(flag==0) //存在负权回路(降低时间)
break;
}
if(low[u0]<0)
return 1;
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&z);
int a,b,c;
num=0;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[num].u=a;
edge[num].v=b;
edge[num++].w=c; edge[num].u=b;
edge[num].v=a;
edge[num++].w=c;
} for(int i=1; i<=z; i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[num].u=a;
edge[num].v=b;
edge[num++].w=-c;
}
int biao=1;
for(int i=1; i<=n; i++)
{
if(Bellman(i))
{
printf("YES\n");
biao=0;
break;
}
}
if(biao)
printf("NO\n");
}
}
/*
780ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f using namespace std; struct node
{
int u,v,w;
} edge[5500];
int low[5500];
int n,m,z;
int num=0;
int Bellman(int u0)
{
for(int i=0; i<=n; i++)
low[i]=INF; low[u0]=0; //初始化
for(int i=0; i<n-1; i++) //n-1次
{
int flag=0;
for(int j=0; j<num; j++)
{
if(low[edge[j].u]!=INF&&low[edge[j].u]+edge[j].w<low[edge[j].v]) //不同点
{ //存在low[edge[j].u]!=INF,就必须有low[u0]=0;初始化
low[edge[j].v]=low[edge[j].u]+edge[j].w;
flag=1;
}
}
if(flag==0) //存在负权回路
break;
} for(int j=0; j<num; j++)
{
if(low[edge[j].u]!=INF&&low[edge[j].u]+edge[j].w<low[edge[j].v])
return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&z);
int a,b,c;
num=0;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[num].u=a;
edge[num].v=b;
edge[num++].w=c; edge[num].u=b;
edge[num].v=a;
edge[num++].w=c;
} for(int i=1; i<=z; i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[num].u=a;
edge[num].v=b;
edge[num++].w=-c;
}
int biao=1;
for(int i=1; i<=n; i++)
{
if(Bellman(i))
{
printf("YES\n");
biao=0;
break;
}
}
if(biao)
printf("NO\n");
}
}
*/

poj 3259 bellman最短路推断有无负权回路的更多相关文章

  1. Wormholes 最短路判断有无负权值

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  2. UVA11090 Going in Cycle!! (二分+SPFA推断有无负权)

    Problem G: Going in Cycle!! Input: standard input Output: standard output You are given a weighted d ...

  3. [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29971   Accepted: 10844 Descr ...

  4. POJ 3259 Wormholes(最短路径,求负环)

    POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...

  5. POJ 3259 Wormholes Bellman_ford负权回路

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  6. Spfa 求含负权边的最短路 + 判断是否存在负权回路

    在Bellman-Ford算法之后,我们总算迎来了spfa算法,其实就如同堆优化Dijkstra算法之于朴素版Dijkstra算法,spfa算法仅仅是对Bellman-Ford算法的一种优化,但是在形 ...

  7. ZOJ 3391 Haunted Graveyard(最短路负权回路)题解

    题意:好长...从(0,0)走到(w-1,h-1),墓碑不能走,走到传送门只能进去不能走到其他地方,经过传送门时间会变化w(可能为负),其他地方都能上下左右走.如果能无限返老还童输出Never,走不到 ...

  8. Bellman-ford算法与SPFA算法思想详解及判负权环(负权回路)

    我们先看一下负权环为什么这么特殊:在一个图中,只要一个多边结构不是负权环,那么重复经过此结构时就会导致代价不断增大.在多边结构中唯有负权环会导致重复经过时代价不断减小,故在一些最短路径算法中可能会凭借 ...

  9. bellman-ford(可判负权回路+记录路径)

    #include<iostream> #include<cstdio> using namespace std; #define MAX 0x3f3f3f3f #define ...

随机推荐

  1. ACM-SG函数之Fibonacci again and again——hdu1848

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  2. UVA - 1471 Defense Lines 树状数组/二分

                                  Defense Lines After the last war devastated your country, you - as the ...

  3. P1233 木棍加工

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  4. webservice为什么不能用List参数,而只能用数组代替,我想是否因为List没有具体的类型信息,但用泛型的List(如:List<customer>)为什么也不行。如果用作参数的类中含有List<T>字段该如何处理?webservice参数是否支持

    转自:https://social.microsoft.com/Forums/zh-CN/aded4301-b5f1-4aa6-aa46-16c46a60d05e/webservice20026201 ...

  5. 使用IDEA 创建 MAVEN 项目

    一,项目创建 1.File---New---project    选择maven       勾选Create from archtype,找到并选择org.apache.maven.archtype ...

  6. Android WebView访问网站携带登录认证Cookies和动态自定义的cookies

    最近项目几个页面要复用微信程序的网页.但是需要调用微网站登录接口,返回Cookies,webview访问需要的网页的时候携带. 并且还需要几个其他的动态改变的cookie,目的是根据这几个动态自定义c ...

  7. rmi 工作原理

    rmi 工作原理 (转) 工作SocketJava应用服务器网络应用  RMI(Remote Method Invocation,远程方法调用)是Java的一组拥护开发分布式应用程序的API.RMI使 ...

  8. ABBYY FineReader 双十二特惠活动正在进行中...

    转眼间11月已悄然飘过,有些童鞋还没缓过双十一的劲,势必将剁手进行到底.只为当时没有鼓足勇气.狠下心来而悔恨其中.别担心,双十二你准备好了么,ABBYY FineReader 系列产品低价让你继续嗨到 ...

  9. Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题

    题意: 给你一个长度为 nnn 的 010101串 ,你有两种操作: 1.将一个子串翻转,花费 XXX 2.将一个子串中的0变成1,1变成0,花费 YYY 求你将这个01串变成全是1的串的最少花费. ...

  10. JS取出特定字符前后的字符串,针对一串字符里面的单个字符前后的字符串

    //针对一串自负里面的单个字符前后的字符串<!doctype html> <html> <head> <meta charset="utf-8&qu ...