poj_3259 负权和环
题目大意
N个点,M条双向路径,W条单向路径。从双向路径的一端到另一端所花费时间为正值,从单向路径的源点到终点所花时间为负值。问是否存在一条从A出发,再回到A的回路,满足回到A的时间小于出发时间。
题目分析
显然为一个求含负权边的图中是否含有负权和回路。采用SPFA算法解决。
实现(c++)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
#define MAX_NODE 505
#define INFINITE 1 << 30
struct Edge{
int vertex;
int dist;
Edge(int v, int d) :
vertex(v), dist(d){};
}; vector<vector<Edge> > gGraph; int gDist[MAX_NODE];
int gUpdateTime[MAX_NODE]; //记录原点到每个点的最短路径被更新的次数,根据SPFA算法,若更新次数>n,则说明存在负环
bool Spfa(int s, int d, int n){
queue<int> Q; Q.push(s); memset(gUpdateTime, 0, sizeof(gUpdateTime)); //每个点被更新次数
for (int i = 1; i <= n; i++) //初始化原点到每个点的距离
gDist[i] = INFINITE;
gDist[s] = 0; while (!Q.empty()){
//SPFA算法,使用一个先进先出队列。按照广度优先,每增加一层的深度,到达当前深度k。就可以确定
//从原点开始到达该点的最短路径为k步的点。
int v = Q.front();
Q.pop();
for (int i = 0; i < gGraph[v].size(); i++){
if (gDist[gGraph[v][i].vertex] > gDist[v] + gGraph[v][i].dist){
gDist[gGraph[v][i].vertex] = gDist[v] + gGraph[v][i].dist;
if (++gUpdateTime[gGraph[v][i].vertex] >= n){ //存在负权和环
return false;
}
Q.push(gGraph[v][i].vertex);
}
}
} return true; //不存在负权和环
}
int main(){
int f;
scanf("%d", &f);
while (f--){
int n, m, w, s, e, t;
scanf("%d %d %d", &n, &m, &w);
gGraph.clear();
gGraph.resize(n + 1);
for (int i = 0; i < m; i++){
scanf("%d %d %d", &s, &e, &t);
gGraph[s].push_back(Edge(e, t));
gGraph[e].push_back(Edge(s, t));
}
for (int i = 0; i < w; i++){
scanf("%d %d %d", &s, &e, &t);
gGraph[s].push_back(Edge(e, -t));
}
if (Spfa(1, n, n)){
printf("NO\n");
}
else
printf("YES\n");
}
return 0;
}
poj_3259 负权和环的更多相关文章
- Bellman-ford算法与SPFA算法思想详解及判负权环(负权回路)
我们先看一下负权环为什么这么特殊:在一个图中,只要一个多边结构不是负权环,那么重复经过此结构时就会导致代价不断增大.在多边结构中唯有负权环会导致重复经过时代价不断减小,故在一些最短路径算法中可能会凭借 ...
- LightOj 1074 Extended Traffic (spfa+负权环)
题目链接: http://lightoj.com/volume_showproblem.php?problem=1074 题目大意: 有一个大城市有n个十字交叉口,有m条路,城市十分拥挤,因此每一个路 ...
- poj_2315 最小费用最大流
题目大意 一个图上有N个顶点,从1到N标号,顶点之间存在一些无向边,边有长度,要求从顶点1走到顶点N,再从顶点N走回顶点1,其中不必要经过每个顶点,但是要求走的路径上的边只能经过一次.求出从1---& ...
- 2017乌鲁木齐网络赛 j 题
题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...
- Vijos1053 Easy sssp[spfa 负环]
描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...
- 【洛谷 P3385】模板-负环(图论--spfa)
题目:有一个图有N个顶点,M条边.边用三个整数a b w表示,意思为a->b有一条权值为w的边(若w<0则为单向,否则双向).共T组数据.对于每组数据,存在负环则输出一行"YE5 ...
- Easy sssp(spfa)(负环)
vijos 1053 Easy sssp 方法:用spfa判断是否存在负环 描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,00 ...
- poj 3259 Wormholes【spfa判断负环】
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36729 Accepted: 13444 Descr ...
- poj3259(spfa判负环)
题目连接:http://poj.org/problem?id=3259 题意:John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时 ...
随机推荐
- ORM,ORM的原理及测试案例
提纲 一.什么是ORM.二.反射以及Attribute在ORM中的应用.三.创建一个数据库表和表对应的实体model.四.实体model如何映射出数据库表.五.组合ORM映射生成insert语句. ...
- 网页中PNG透明背景图片的完美应用
PNG 图片在网站设计中是不可或缺的部分,最大的特点应该在于 PNG 可以无损压缩,而且还可以设置透明,对于增强网站的图片色彩效果有重要的作用. 但为什么 PNG 图片却没有 GIF 和 JPG 图片 ...
- 从JavaScript 数组去重看兼容性有关问题,及性能优化(摘自玉伯博客)
JavaScript 数组去重经常出现在前端招聘的笔试题里,比如: 有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScr ...
- 微信小程序请求wx.request数据,渲染到页面
先说一下基本使用.官网也有. 比如说你在App.js里面有这些变量.想修改某些值. data: { main_view_bgcolor: "", border: "&qu ...
- [svc]linux查看主板型号及内存硬件信息
公司服务器内存不够用了. 想看看买啥型号的. 购买内存条注意点: ddr3 or4 频率 块钱. 内存槽及内存条: dmidecode |grep -A16 "Memory Device$& ...
- weblogic线程阻塞性能调优(图解)转
声明:出现这个问题有程序方面.网络方面.weblogic设置方面等等原因,此文章主要讲述由于weblogic设置而导致的解决办法. 因为: 1.程序问题,需要项目自己去解决,weblogic在做优化处 ...
- 一个很好用的系统管理的命令lsof(转载)
最近发现LOSF 命令在系统管理方面特别有用,把我搜集的资料总结如下 1.当在lsof后边没有跟任何参数时,该命令将会列出当前系统中被所有进程打开的所有文件#lsof|nl #nl命令打印出行号 2. ...
- Oracle:shared memory realm does not exist
1. 先描述一个连接Oracle 10g的错误:“shared memory realm does not exist” 如图所示Sqlplus连接时出现这个错误: 2. Oracle 服务器主要组件 ...
- ibatis中integer类型
假如java代码中设置的返回类型是integer类型,ibatis实际上返回的是BigDecimal,也就是说 ibatis转换成integer默认是bigdecimal类型的
- word字号
1 大特号 63 2 特 号 54 3 初 号 42 4 小初号 36 5 大一号 31.5 6 一 号 28 7 小一号 24 8 二 号 21 9 小二号 18 10 三 号 16 11 小三号 ...