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. java获取服务器所有信息

    package com.sinosoft.outher.listener; import java.net.InetAddress;import java.net.UnknownHostExcepti ...

  2. node js 调试

    npm install -g node-inspector node --debug app.js >重新打开一个窗口   node-inspector &   KO!       no ...

  3. apache+tomcat分布式集群搭建

    今天搭建apche+tomcat分布式集群,遇到很多问题,在网上找到的很多都不成功,然后和同事一起研究了一下,最终搭建成功了.做个笔记,以备自己以后参考. 1,下载apache.在下载Apache(2 ...

  4. JavaScript高级程序设计笔记之面向对象

    说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,Jav ...

  5. 编程范式 epesode2 negative values, float 精度

    episode2 //it is very interesting,an excellect teacher,  I love it 1,why negative is indicated the w ...

  6. 移动端调试工具-Weinre

    java版本安装和调试 首先需要下载 weinre, weinre目前支持Windows与MacOS, 本文中以Windows版为例. 下载地址:http://people.apache.org/~p ...

  7. SQL镜像资料

    使用数据库镜像端点证书 (Transact-SQL):https://msdn.microsoft.com/zh-cn/library/ms191477.aspx 允许数据库镜像端点将证书用于入站连接 ...

  8. VC++ 控制外部程序,向外部程序发送一个消息的方法

    这里需要考虑两部分的内容: 发送端: 查找对应的窗体,找到CWnd的值 向窗体发送消息 举例: CWnd* wnd = FindWindow(NULL, _T("选择题做题过程中" ...

  9. js中数组

  10. [INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突

    windows server 2008 r2 enterprise下的解决办法为:删除C:\Program Files (x86)\Oracle\Inventory\ContentsXML目录下的in ...