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.

题目大意就是:农夫约翰有F个农场,每个农场有N块地,其间有M条路(无向),W条时光隧道(有向且时间倒流即:权值为负)。问是否可能回到过去?

经典的bellman_Ford理解题,不知道的可以去百度!

//Asimple
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cctype>
#include <cstdlib>
#include <stack>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <queue>
#include <limits.h>
#include <time.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
typedef long long ll;
int n, m, num, T, k, x, y, len;
int Map[maxn][maxn];
int dis[maxn];
typedef struct node {
int begin;
int end;
int weight;
node(){}
node(int begin, int end, int weight) {
this->begin = begin;
this->end = end;
this->weight = weight;
}
}eee;
eee edg[maxn];
//Bellman-Ford算法:求含负权图的单源最短路径算法
//单源最短路径(从源点s到其它所有顶点v)
bool bellmanFord() {
memset(dis, , sizeof(dis));
for(int i=; i<n; i++) {
for(int j=; j<len; j++) {
eee e = node(edg[j].begin, edg[j].end, edg[j].weight);
if( dis[e.end] > dis[e.begin] + e.weight) {
dis[e.end] = dis[e.begin] + e.weight;
if( i == n- ) return true;
}
}
}
return false;
} void input() {
cin >> T ;
while( T -- ) {
cin >> n >> m >> k;
len = ;
for(int i=; i<m; i++) {
cin >> x >> y >> num;
edg[len].begin = x;
edg[len].end = y;
edg[len].weight = num;
len ++;
edg[len].begin = y;
edg[len].end = x;
edg[len].weight = num;
len ++;
}
for(int i=; i<k; i++) {
cin >> x >> y >> num ;
edg[len].begin = x;
edg[len].end = y;
edg[len].weight = -num;
len ++;
}
if( bellmanFord() ) cout << "YES" << endl;
else cout << "NO" << endl;
}
} int main(){
input();
return ;
}

2017-5-26  修改:

自己写了一个邻接矩阵的SPFA解法

坑点:可能会出现重复的路径,这个时候需要取小值。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = +;
const int INF = ( << );
int n, m, x, y, num, T, k;
int Map[maxn][maxn], dis[maxn], c[maxn]; void init(){
for(int i=; i<=n; i++) {
dis[i] = INF;
c[i] = ;
for(int j=; j<=n; j++) {
Map[i][j] = INF;
}
}
} bool spfa(){
bool vis[maxn];
queue<int> q;
memset(vis, false, sizeof(vis));
q.push();
vis[] = true;
c[] = ;
dis[] = ;
while( !q.empty() ) {
x = q.front();q.pop();
vis[x] = false;
for(int i=; i<=n; i++) {
if( dis[i]>dis[x]+Map[x][i] ) {
dis[i] = dis[x]+Map[x][i];
if( !vis[i] ) {
vis[i] = true;
c[i] ++;
if( c[i]>=n ) return true;
q.push(i);
}
}
}
}
return false;
} int main(){
cin >> T;
while( T -- ) {
cin >> n >> m >> k;
init();
while( m -- ) {
cin >> x >> y >> num;
Map[x][y] = min(Map[x][y], num);
Map[y][x] = Map[x][y];
}
while( k -- ) {
cin >> x >> y >> num;
Map[x][y] = min(Map[x][y], -num);
}
if( spfa() ) cout << "YES" << endl;
else cout << "NO" << endl;
}
return ;
}

Wormholes的更多相关文章

  1. [题解]USACO 1.3 Wormholes

    Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...

  2. POJ 3259 Wormholes (判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 46123 Accepted: 17033 Descripti ...

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

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

  4. poj 3259 Wormholes 判断负权值回路

    Wormholes Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u   Java ...

  5. Wormholes(Bellman-ford)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 33008   Accepted: 12011 Descr ...

  6. poj3259 bellman——ford Wormholes解绝负权问题

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35103   Accepted: 12805 Descr ...

  7. 最短路(Bellman_Ford) POJ 3259 Wormholes

    题目传送门 /* 题意:一张有双方向连通和单方向连通的图,单方向的是负权值,问是否能回到过去(权值和为负) Bellman_Ford:循环n-1次松弛操作,再判断是否存在负权回路(因为如果有会一直减下 ...

  8. Wormholes 分类: POJ 2015-07-14 20:21 21人阅读 评论(0) 收藏

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35235   Accepted: 12861 Descr ...

  9. POJ 3259 Wormholes (Bellman_ford算法)

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

随机推荐

  1. java.lang.StringBuilder

    1.StringBuilder 的对象和 String 的对象类似,并且 StringBuilder 的对象能被修改.Internally,这个对象被当做一个包含一系列字符的可变长度的数组对待.这个序 ...

  2. 数位DP HDU2089

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. bzoj1150: [CTSC2007]数据备份Backup--贪心+优先队列维护堆

    题目大意:将k对点两两相连,求最小长度 易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优 然后就可以用贪心来做这道题了.. 之前向CZL大神学习了用堆来贪心的做法orz 大概思路就是将 ...

  4. C++复制对象时勿忘每一部分

    现看这样一个程序: void logCall(const string& funcname) //标记记录 { cout <<funcname <<endl; } cl ...

  5. Chrome浏览器插件推荐大全

    如何下载:http://www.cnplugins.com/devtool/ 提示:下载可能版本过旧,推荐搜索喜爱的插件之后前往官网或者github(编译的时候确保node和npm都是最新的版本).或 ...

  6. PowerDesigner V16.5 安装文件 及 破解文件

    之前在网上找个假的,只能看,不能创建自己的DB; 或者 不能破解的,比较伤脑筋. 偶在这里提供一个 可长期使用的版本. PowerDesigner165_破解文件.rar    链接:http://p ...

  7. Properties类使用

    package com.emolay.util; import java.io.IOException; import java.io.InputStream; import java.util.Pr ...

  8. C#winform调用外部程序,等待外部程序执行完毕才执行下面代码

    1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...

  9. Mysql VARCHAR(X) vs TEXT

    一般情况下,我们不太会纠结用Varchar或text数据类型. 比如说,我们要存储邮箱,我们自然会用varchar,不会想到用text.而当我们要存储一段话的时候,选了text,感觉varchar也够 ...

  10. vscode 编写python如何禁止 flake8 提示 line too long

    使用vscode编写python还是挺舒服的,但是如果给vscode安装了语法校验插件,例如flake8,会常常提示一些非常苛刻的语法问题,其中最让人不能忍受的就是line to long. 一行仅能 ...