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 ...
随机推荐
- angular2-模块
Angular模块 (NgModule) Angular 模块是带有 @NgModule 装饰器函数的类. @NgModule接收一个元数据对象,该对象告诉 Angular 如何编译和运行模块代码. ...
- javascript接入阿里云服务器
authInfo = r.data.authInfo[0]//后台请求的 var client = new OSS({ region: 'oss-cn-beijing',// 云账号AccessKey ...
- Java的输入/输出操作
Java的输入\输出机制 计算机的基本功能就是通过输入输出设备与外部其他设备尽心数据的交互,从其他设备读入数据叫做输入操作,将计算机内的数据写入到其他设备叫做输出操作.可以向计算机发送数据.又可以接受 ...
- 某虚拟定位APP从破解到原理分析
工具环境ida7.0iphone 6ios 10.2 0x00:基本情况 1. 该app可以修改模拟手机地理位置(gps.基站.WIFI),拥有全局定位.指定应用定位.模拟扫街等功能,只能在已越狱的I ...
- 去掉iframe白色背景方法
在iframe内添加如下代码 style="display:none" onload="this.style.display = 'block';" 先让它不显 ...
- Rational ClearCase 系列
Base + UCM 系列参考:http://blog.csdn.net/hhg208/article/details/5749050
- sqlserver学习3---sql函数
一.SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQL 语言也包含用于更新 ...
- RAC常用日志总结
12C RAC:ocssd启动失败log目录:/u01/app/grid/diag/crs/host02/crs/trace/alert.log
- 一个自动生成awr报告的shell脚本
最近在学习shell编程,搞一点点小工具自动完成awr报告的收集工作,方便系统出现问题时问题排查.脚本内容如下,系统收集每天开始时间6点结束时间20点的awr报告并存储在/u01/shell_t/aw ...
- RedHat 6.4源码方式安装mysql5.5
参考文档:http://dev.mysql.com/downloads/file/?id=463397 下载地址http://dev.mysql.com/doc/refman/5.7/en/ 文档地址 ...