poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)
/**
problem: http://poj.org/problem?id=3259
spfa判负环:
当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数)
spfa双端队列优化:
维护队列使其dist小的点优先处理
**/
#include<stdio.h>
#include<deque>
#include<algorithm>
using namespace std; class Graphics{
const static int MAXN = ;
const static int MAXM = * + ;
const static int INF = 0x7fffffff;
private:
struct Edge{
int to, dist, next;
}edge[MAXM];
int first[MAXN], sign, sumOfPoint;
public:
void init(int n){
sumOfPoint = n;
for(int i = ; i <= n; i ++){
first[i] = -;
}
sign = ;
}
void addEdgeOneWay(int u, int v, int w){
edge[sign].dist = w;
edge[sign].to = v;
edge[sign].next = first[u];
first[u] = sign ++;
}
void addEdgeTwoWay(int u, int v, int w){
addEdgeOneWay(u, v, w);
addEdgeOneWay(v, u, w);
}
bool spfaNegRing(int start){
bool *vis = new bool[sumOfPoint+];
int *dist = new int[sumOfPoint+];
int *cnt = new int[sumOfPoint+];
for(int i = ; i <= sumOfPoint; i ++){
vis[i] = ;
cnt[i] = ;
dist[i] = INF;
}
deque<int> que;
que.push_front(start);
dist[start] = ;
vis[start] = ;
while(!que.empty()){
int now = que.front();
que.pop_front();
vis[now] = ;
for(int i = first[now]; i != -; i = edge[i].next){
int to = edge[i].to, eDist = edge[i].dist;
if(dist[now] + eDist < dist[to]){
dist[to] = dist[now] + eDist;
cnt[to] ++;
if(cnt[to] >= sumOfPoint) { /// 如果这个点已经松弛n次则它必定是负环中的一个点
delete []vis; delete []dist; return true;
}
if(!vis[to]){
vis[to] = ;
if(que.empty() || dist[to] <= dist[que.front()])
que.push_front(to);
else
que.push_back(to);
}
}
}
}
delete []vis; delete []dist; return false;
}
}graph; int main(){
int f;
scanf("%d", &f);
while(f --){
int n, m, w;
scanf("%d%d%d", &n, &m, &w);
graph.init(n);
while(m --){
int s, e, t;
scanf("%d%d%d", &s, &e, &t);
graph.addEdgeTwoWay(s, e, t);
}
while(w --){
int s, e, t;
scanf("%d%d%d", &s, &e, &t);
graph.addEdgeOneWay(s, e, -t);
}
printf("%s\n", graph.spfaNegRing() ? "YES" : "NO");
}
return ;
}
poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)的更多相关文章
- POJ 3259 Wormholes(bellman_ford,判断有没有负环回路)
题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前 ...
- 关于SPFA的双端队列优化
7.11 Update 我做题的时候发现这样写会RE 因为在使用双端队列优化SPFA的时候 在将一个点加入队列的时候,如果队列已经空了 那么一旦出现dis[Q.front()]就会RE 可以这样修改 ...
- Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化
设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子 转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就 ...
- ACM: POJ 3259 Wormholes - SPFA负环判定
POJ 3259 Wormholes Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu ...
- POJ 3259 Wormholes(SPFA判负环)
题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...
- POJ 3259 Wormholes SPFA算法题解
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- POJ 3259 Wormholes ( SPFA判断负环 && 思维 )
题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...
- poj 3259 Wormholes spfa算法
点击打开链接 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25582 Accepted: 9186 ...
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29971 Accepted: 10844 Descr ...
随机推荐
- Thrift笔记(六)--单端口 多服务
多个服务,使用监听一个端口.先上一个demo Test.thrift namespace java com.gxf.thrift enum RequestType { SAY_HELLO, //问好 ...
- Spring入门案例 idea创建Spring项目
spring入门案例 idea创建spring项目 Spring介绍 Spring概述 Spring是一个开源框架,Spring是2003年兴起的轻量级java开发框架,由Rod Johnson 在其 ...
- Datatable paging,Repeater with Paging
/// <summary> /// 塗聚文 /// 20140225 /// </summary> public partial class DatatablePage : S ...
- SQL Server迭代求和
drop table t_geovindu create table t_geovindu ( xid int IDENTITY (1, 1), price money, DebitCredit VA ...
- 软件项目技术点(2)——Canvas之坐标系转换
AxeSlide软件项目梳理 canvas绘图系列知识点整理 默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为 ...
- MongoDB学习之mongoose
MongoDB介绍: MongoDB是基于Javascript语言的数据库,存储格式是JSON,而Node也是基于JavaScript的环境(库),所以node和mongoDB的搭配能减少因为数据转换 ...
- ezdpl Linux自动化部署实战
最近把ezdpl在生产环境中实施了,再加上这段时间的一些修改,一并介绍一下. 再次申明: ezdpl不是开箱即用的,需要根据自己的应用环境定制.对初学者来说使用起来反倒困难更多.风险更大. 它不是一个 ...
- Android java获取凌晨的时间戳
这两天有一个需求是查询用户匹配的推荐信息,包含一个有效时间段,以天为单位,0时0分0秒这种. 通常java中有两种方案: 第一种:Calendar.这种比较简单,也最常见.代码如下: Calendar ...
- Oracle 通过undo块查看事务信息
数据库版本:Oracle 11.2.0.3 RAC 实验目的:通过undo块查看Oracle事务信息 实验细节:1 开始一个事务SQL> select * from t1; ID NAME--- ...
- codefind.pl
#!/usr/bin/perl # # Find a pattern in a the book's source collection (DOS/Windows version) # # (C) C ...