poj-3259 Wormholes(无向、负权、最短路之负环判断)
http://poj.org/problem?id=3259
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 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
Sample Input
Sample Output
NO
YES
Hint
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.
题目大意:
时空旅行,前m条路是双向的,旅行时间为正值,w条路是虫洞,单向的,旅行时间是负值,也就是能回到过去。求从一点出发,判断能否在”过去“回到出发点,即会到出发点的时间是负的。
解题思路:
裸的负权最短路问题,SPFA Bellman-Ford解决。
#include<iostream>
#include<cstdio>
using namespace std;
#define INF 0x3f3f3f3f
#define N 10100
int nodenum, edgenum, w, original=; //点,边,起点 typedef struct Edge //边
{
int u;
int v;
int cost;
}Edge;//边的数据结构 Edge edge[N];//边 int dis[N];//距离 bool Bellman_Ford()
{
for(int i = ; i <= nodenum; ++i) //初始化
dis[i] = (i == original ? : INF);
int F=;
for(int i = ; i <= nodenum - ; ++i)//进行nodenum-1次的松弛遍历
{
for(int j = ; j <= edgenum*+w; ++j)
{
if(dis[edge[j].v] > dis[edge[j].u] + edge[j].cost) //松弛(顺序一定不能反~)
{
dis[edge[j].v] = dis[edge[j].u] + edge[j].cost;
F=;
}
}
if(!F)
break;
}
//与迪杰斯特拉算法类似,但不是贪心!
//并没有标记数组
//本来松弛已经结束了
//但是因为由于负权环的无限松弛性
bool flag = ; //判断是否含有负权回路
//如果存在负权环的话一定能够继续松弛
for(int i = ; i <= edgenum*+w; ++i)
{
if(dis[edge[i].v] > dis[edge[i].u] + edge[i].cost)
{
flag = ;
break;
}
}
//只有在负权环中才能再松弛下去
return flag;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{ scanf("%d %d %d", &nodenum, &edgenum, &w); for(int i = ; i <= *edgenum; i+=)//加上道路,双向边
{
scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].cost);
edge[i+].u=edge[i].v;
edge[i+].v=edge[i].u;
edge[i+].cost=edge[i].cost;
}
for(int i =*edgenum+; i <= *edgenum+w; i++)//加上虫洞,单向边,负权
{
scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].cost);
edge[i].cost=-edge[i].cost;
}
if(Bellman_Ford())//没有负环
printf("NO\n");
else
printf("YES\n");
}
return ;
}
poj-3259 Wormholes(无向、负权、最短路之负环判断)的更多相关文章
- POJ 3259 Wormholes 虫洞(负权最短路,负环)
题意: 给一个混合图,求判断是否有负环的存在,若有,输出YES,否则NO.有重边. 思路: 这是spfa的功能范围.一个点入队列超过n次就是有负环了.因为是混合图,所以当你跑一次spfa时发现没有负环 ...
- poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)
/** problem: http://poj.org/problem?id=3259 spfa判负环: 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数) spfa双端队列优化: 维 ...
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29971 Accepted: 10844 Descr ...
- ACM: POJ 3259 Wormholes - SPFA负环判定
POJ 3259 Wormholes Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu ...
- POJ 3259 Wormholes(最短路径,求负环)
POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...
- 最短路(Bellman_Ford) POJ 3259 Wormholes
题目传送门 /* 题意:一张有双方向连通和单方向连通的图,单方向的是负权值,问是否能回到过去(权值和为负) Bellman_Ford:循环n-1次松弛操作,再判断是否存在负权回路(因为如果有会一直减下 ...
- poj - 3259 Wormholes (bellman-ford算法求最短路)
http://poj.org/problem?id=3259 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W ...
- poj 3259 Wormholes 判断负权值回路
Wormholes Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...
- POJ 3259 Wormholes Bellman_ford负权回路
Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...
- POJ 3259 Wormholes(负权环路)
题意: 农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地,M条路连接着两块地,W个虫洞,连接两块地的路是双向的,而虫洞是单 ...
随机推荐
- Flink并行度
并行执行 本节介绍如何在Flink中配置程序的并行执行.FLink程序由多个任务(转换/操作符.数据源和sinks)组成.任务被分成多个并行实例来执行,每个并行实例处理任务的输入数据的子集.任务的并行 ...
- Android群英传知识点回顾——第十章:Android性能优化
10.1 布局优化 10.1.1 Android UI渲染机制 10.1.2 避免Overdraw 10.1.3 优化布局层级 10.1.4 避免嵌套过多无用布局 10.1.5 Hierarchy V ...
- Tensorflow Mask-RCNN(三)——实时 检测视频
参考:https://www.youtube.com/watch?v=lLM8oAsi32g import cv2 import numpy as np def ran ...
- VEH&VCH
本文99.9%的代码及内容作者:mengwuji 来自:http://www.mengwuji.net/forum.php?mod=viewthread&tid=1371 VEH:向量化异常处 ...
- SpingBoot项目搭建(详细)
SpingBoot (原创:黑小子-余) springboot官网:->点击<- spring官网:->点击<- 一.SpringBoot简介 Spring Boot是由Piv ...
- windows server 2012 ftp搭建
1.安装IIS的时候勾选ftp 2.创建ftp站点,先检查21端口是否开放 一定要勾选身份认证,匿名去掉,不然一直登陆不了,也不提示 一直点下一步, 遇到的坑,第一个:出现“打开ftp服务器上的文件夹 ...
- E. Double Elimination (DP)
题目:传送门 题意:有 2^n 个人进行比赛,对他们编号 1~2^n,起初1和2打,3和4打,5和6打,7和8打...,然后1和2打完胜利的 和 3和4打完胜利的再打一场,1和2打完失败的和3和4打完 ...
- 19.3.8 HTML+css 课程
form 归属于 form 通过id产生联系 <form id = "testform" method = "get" action = "s ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:Math(算数) 对象
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 最长特殊序列 II
最长特殊序列 II class Solution { boolean containsSub(String s,String p){ int i,j; for(i=0,j=0;i<p.lengt ...