Wormholes 最短路判断有无负权值
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
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 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.
#include<stdio.h>
#include<string.h>
#include<stdlib.h> const int EM = ;
const int VM = ;
const int INF = ;
struct node
{
int u,v,w;
}map[EM]; int cnt,dis[VM];
int n,m,k; void addedge(int au,int av,int aw)
{
map[cnt].u = au;
map[cnt].v = av;
map[cnt].w = aw;
cnt++;
} int Bellman_ford()
{
int flag ,i;
//初始化
for( i = ; i <= n; i++)
{
dis[i] = INF;
}
dis[] =; for( i = ; i <= n; i++)
{
flag = ;
for(int j = ; j < cnt; j++)
{
if(dis[map[j].v] > dis[map[j].u]+map[j].w)
{
dis[map[j].v] = dis[map[j].u]+map[j].w;
flag = ;
}
}
if(flag== ) break;
}
if(i == n+) return ;//若第n次还可以松弛说明存在负环
else return ;
} int main()
{
int t,u,v,w,ans;
scanf("%d",&t);
while(t--)
{
cnt = ;
scanf("%d %d %d",&n,&m,&k);
while(m--)
{
scanf("%d %d %d",&u,&v,&w);
//添加双向边
addedge(u,v,w);
addedge(v,u,w);
}
while(k--)
{
scanf("%d %d %d",&u,&v,&w);
//添加单向边
addedge(u,v,-w);
}
ans = Bellman_ford();
if(ans == )
printf("YES\n");
else printf("NO\n");
}
return ;
}
//spfa判断有无负环
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<queue>
using namespace std; const int MAX = ;
const int INF = ;
int n,m,w;
int map[MAX][MAX];
queue<int>que;
int inque[MAX];
int vexcnt[MAX];
int dis[MAX]; bool spfa()
{
memset(inque,,sizeof(inque));
memset(vexcnt,,sizeof(vexcnt));
for(int i = ; i <= n; i++)
dis[i] = INF;
dis[] = ;
que.push();
inque[] = ;
vexcnt[]++;
while(!que.empty())
{
int tmp = que.front();
que.pop();
inque[tmp] = ;
for(int i = ; i <= n; i++)
{
if(dis[tmp] < INF && dis[i] > dis[tmp] + map[tmp][i])
{
dis[i] = dis[tmp] + map[tmp][i];
if(inque[i] == )
{
inque[i] = ;
vexcnt[i]++;
que.push(i);
if(vexcnt[i] >= n)
{
return false;
}
}
}
}
}
return true;
}
int main()
{
int t;
int x,y,z;
scanf("%d",&t);
while(t--)
{
while(!que.empty())que.pop();
scanf("%d %d %d",&n,&m,&w);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
if(i == j) map[i][j] = ;
else map[i][j] = INF;
}
for(int i = ; i <= m; i++)
{
scanf("%d %d %d",&x,&y,&z);
if(map[x][y] > z)
{
map[x][y] = z;
map[y][x] = z;
}
}
for(int i = ; i <= w; i++)
{
scanf("%d %d %d",&x,&y,&z);
if(map[x][y] > -z)
map[x][y] = -z;
}
if(spfa())
printf("NO\n");
else printf("YES\n");
}
return ;
}
<Bellman-Ford算法>
Wormholes 最短路判断有无负权值的更多相关文章
- poj 3259 bellman最短路推断有无负权回路
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36717 Accepted: 13438 Descr ...
- poj 3259 Wormholes 判断负权值回路
Wormholes Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...
- 非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...
- Expm 10_1 带负权值边的有向图中的最短路径问题
[问题描述] 对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环. package org.xiu68.exp.exp10; p ...
- POJ-3259 Wormholes---SPFA判断有无负环
题目链接: https://vjudge.net/problem/POJ-3259 题目大意: 农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的 ...
- poj3259,简单判断有无负环,spfa
英语能力差!百度的题意才读懂!就是一个判断有无负环的题.SPFA即可.,注意重边情况!! #include<iostream> //判断有无负环,spfa #include<queu ...
- poj-3259 Wormholes(无向、负权、最短路之负环判断)
http://poj.org/problem?id=3259 Description While exploring his many farms, Farmer John has discovere ...
- 图之单源Dijkstra算法、带负权值最短路径算法
1.图类基本组成 存储在邻接表中的基本项 /** * Represents an edge in the graph * */ class Edge implements Comparable< ...
- hdu 6201 transaction (最短路变形——带负权最长路)
题意: 给定n个城市的货物买卖价格, 然后给定n-1条道路,每条路有不同的路费, 求出从某两个城市买卖一次的最大利润. 利润 = 卖价 - (买价 + 路费) 样例数据, 最近是从第一个点买入, 第4 ...
随机推荐
- Redis配置文件分析
#Redis演示示例配置文件 # 注意单位问题:当须要设置内存大小的时候,能够使用类似1k.5GB.4M这种常见格式: # # 1k=> 1000 bytes #1kb => 1024 b ...
- Meth | elementary OS常用配置
一,搜狗输入法 sudo apt-get remove ibussudo add-apt-repository ppa:fcitx-team/nightlysudo apt-get updatesud ...
- Java基础知识强化之IO流笔记19:FileOutputStream的三个write方法
1. FileOutputStream的三个write方法: void write(byte[] buffer) Writes the entire contents of th ...
- yii 验证码那点事儿
今天要使用yii验证码, 不过, 这个验证码是整站通用的, 也就是说, 有个表单的提交是使用ajax方式来提交, 整站, 不管在哪个地方, 都能点出来此窗口, 来提交信息 关于yii验证码, fram ...
- 关于C#中get和set
在看书的时候看见了一段代码,有两个类person: public class person { public string name; } public class person { public s ...
- MySQL存储过程(一)
1.1 CREATE PROCEDURE (创建) CREATE PROCEDURE存储过程名 (参数列表) BEGIN SQL语句代码块 END 注意: 由括号包围的参数列必须总是存在.如果没有参 ...
- UIViewController的View显示在导航栏下面如何解决?
ios7之前的版本中UIViewController中的view在显示后会自动调整为去掉导航栏的高度的,控件会自动在导航栏以下摆放. 在iOS7中UIViewController的wantsFullS ...
- json+一般处理程序读取数据库数据
一般处理程序的语法结构 string jsoncallback = context.Request["jsoncallback"]; 声明变量 前台传值使用 stri ...
- Maven Profile标签
Maven Profiles标签可以针对不同的环境来使用不同的配置文件 在发布的时候可以用 mvn release -p product mvn release -p test mvn release ...
- canvas 渐变
那么第一种渐变方式就是LinearGradient,具体实施就是以下代码: var colorStyle=context.createLinearGradient(0,0,0,HEIGHT); col ...