Wormholes

Time Limit: 2000 MS Memory Limit: 65536 KB

64-bit integer IO format: %I64d , %I64u   Java class name: Main

[Submit] [Status] [Discuss]

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.
//Memory Time
//308K 204MS #include<iostream>
#include <string.h>
using namespace std; int dis[]; //源点到各点权值
const int max_w=; //无穷远 struct weight
{
int s;
int e;
int t;
}edge[]; int N,M,W_h; //N (1≤N≤500)fields 顶点数
//M (1≤M≤2500)paths 正权双向边
//W_h (1≤W≤200) wormholes 虫洞(回溯),负权单向边
int all_e; //边集(边总数) bool bellman()
{
bool flag; /*relax*/ for(int i=;i<N-;i++) ///dis松弛的次数
{
flag=false;
for(int j=;j<all_e;j++) ///所有边集
if(dis[edge[j].e] > dis[edge[j].s] + edge[j].t) ///可以松弛 更新
{
dis[edge[j].e] = dis[edge[j].s] + edge[j].t;
flag=true; //relax对路径有更新
}
if(!flag)
break; //只要某一次relax没有更新,说明最短路径已经查找完毕,或者部分点不可达,可以跳出relax
}///已经更新完毕了 所有边集都是两点之间的最短路 /*Search Negative Circle*/ for(int k=;k<all_e;k++) ///遍历所有边集 如果还出现能够再次更新成最短的边 就表明出现负权值回路了
if( dis[edge[k].e] > dis[edge[k].s] + edge[k].t)
return true;
return false;
}
int main(void)
{
int u,v,w; int F;
cin>>F;
while(F--)
{
memset(dis,max_w,sizeof(dis)); //源点到各点的初始值为无穷,即默认不连通 cin>>N>>M>>W_h; all_e=; //初始化指针 /*read in Positive Paths*/ for(int i=;i<=M;i++)
{
cin>>u>>v>>w;
edge[all_e].s=edge[all_e+].e=u;
edge[all_e].e=edge[all_e+].s=v;
edge[all_e++].t=w;
edge[all_e++].t=w; //由于paths的双向性,两个方向权值相等,注意指针的移动
} /*read in Negative Wormholds*/ for(int j=;j<=W_h;j++)
{
cin>>u>>v>>w;
edge[all_e].s=u;
edge[all_e].e=v;
edge[all_e++].t=-w; //注意权值为负
} /*Bellman-Ford Algorithm*/ if(bellman())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return ;
}
//Memory Time
//308K 204MS #include<iostream>
#include <string.h>
using namespace std; int dis[]; //源点到各点权值
const int max_w=; //无穷远 struct weight
{
int s;
int e;
int t;
}edge[]; int N,M,W_h; //N (1≤N≤500)fields 顶点数
//M (1≤M≤2500)paths 正权双向边
//W_h (1≤W≤200) wormholes 虫洞(回溯),负权单向边
int all_e; //边集(边总数) bool bellman()
{
bool flag; /*relax*/ for(int i=;i<N-;i++) ///dis松弛的次数
{
flag=false;
for(int j=;j<all_e;j++) ///所有边集
if(dis[edge[j].e] > dis[edge[j].s] + edge[j].t) ///可以松弛 更新
{
dis[edge[j].e] = dis[edge[j].s] + edge[j].t;
flag=true; //relax对路径有更新
}
if(!flag)
break; //只要某一次relax没有更新,说明最短路径已经查找完毕,或者部分点不可达,可以跳出relax
}///已经更新完毕了 所有边集都是两点之间的最短路 /*Search Negative Circle*/ for(int k=;k<all_e;k++) ///遍历所有边集 如果还出现能够再次更新成最短的边 就表明出现负权值回路了
if( dis[edge[k].e] > dis[edge[k].s] + edge[k].t)
return true;
return false;
}
int main(void)
{
int u,v,w; int F;
cin>>F;
while(F--)
{
memset(dis,max_w,sizeof(dis)); //源点到各点的初始值为无穷,即默认不连通 cin>>N>>M>>W_h; all_e=; //初始化指针 /*read in Positive Paths*/ for(int i=;i<=M;i++)
{
cin>>u>>v>>w;
edge[all_e].s=edge[all_e+].e=u;
edge[all_e].e=edge[all_e+].s=v;
edge[all_e++].t=w;
edge[all_e++].t=w; //由于paths的双向性,两个方向权值相等,注意指针的移动
} /*read in Negative Wormholds*/ for(int j=;j<=W_h;j++)
{
cin>>u>>v>>w;
edge[all_e].s=u;
edge[all_e].e=v;
edge[all_e++].t=-w; //注意权值为负
} /*Bellman-Ford Algorithm*/ if(bellman())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return ;
}

poj 3259 Wormholes 判断负权值回路的更多相关文章

  1. POJ 3259 Wormholes Bellman_ford负权回路

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

  2. POJ 3259 Wormholes(负权环路)

    题意: 农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地,M条路连接着两块地,W个虫洞,连接两块地的路是双向的,而虫洞是单 ...

  3. ACM: POJ 3259 Wormholes - SPFA负环判定

     POJ 3259 Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu   ...

  4. poj 3259 (Bellman_Ford判断负环)

    题意:John的农场里n块地,m条路连接两块地,k个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己. 思路:虫洞 ...

  5. Wormholes POJ - 3259 spfa判断负环

    //判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...

  6. POJ 3259 Wormholes (Bellman_ford算法)

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  7. POJ 3259 Wormholes(最短路&spfa正权回路)题解

    题意:给你m条路花费时间(双向正权路径),w个虫洞返回时间(单向负权路径),问你他能不能走一圈回到原点之后,时间倒流. 思路:题意有点难看懂,我们建完边之后找一下是否存在负权回路,存在则能,反之不能. ...

  8. Poj 3259 Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...

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

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

随机推荐

  1. scrollView实现基础中心点缩放及与UIPageControl结合使用

    一般来说scrollView与UIPageControl都是结合使用,因为在使用滚动视图的时候 ,使用UIPageControl,用户可以 清楚 的明白显示的内容有多少页,如果 没有的话,总不能让用户 ...

  2. JS --正则表达式验证、实战之邮箱模式

     JS验证格式:提高用户体验,验证文本. 需要防止程序员的代码结构更改攻击,因为web段的代码有可能会被更改,更改后JS有可能会验证不住那么,C#端在JS段通过验证的情况下,还需要进行二次验证 < ...

  3. Jsoncpp的使用

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...

  4. 《深入理解Nginx》阅读与实践(三):使用upstream和subrequest访问第三方服务

    本文是对陶辉<深入理解Nginx>第5章内容的梳理以及实现,代码和注释基本出自此书. 一.upstream:以向nginx服务器的请求转化为向google服务器的搜索请求为例 (一)模块框 ...

  5. rotate the clock

    A program test: You are given N round clocks. Every clock has M hands, and these hands can point to ...

  6. Spring MVC开发环境的搭建和实例

    一.安装jdk 二.安装tomcat 三.安装maven 新增环境变量MAVEN-HOME,并在path变量中添加bin路径 四.安装IntelliJ IDEA 五.创建maven web项目选择jd ...

  7. 更改Windows系统时间同步频率【windows 7,windows 8,win10】

    Windows系统默认的时间同步间隔是7天,如果我们需要修改同步的时间间隔(同步频率),我们可以通过修改注册表来手动修改它的自动同步间隔以提高同步次数,保证时钟的精度,windows7,Windows ...

  8. 剑指offer题目1-10

    面试题3:二维数组中的查找 public class Solution { public boolean Find(int [][] array,int target) { boolean isFou ...

  9. git常用命令1

    git clone   #克隆远程仓库的项目到本地 git config --global user.name ""    #查看或设置贡献者的名字 git config --gl ...

  10. 统计学习方法 AdaBoost

    提升方法的基本思路 在概率近似正确(probably approximately correct,PAC)学习的框架中, 一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那 ...