poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)
2024-09-03 08:00:44
/**
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 ;
}
最新文章
- UVa1592_数据库
- osg中遇到的问题
- Freemarker中通过request获得contextPath
- Maven——使用Maven构建多模块项目
- 第五章_PHP流程控制
- Java [leetcode 33]Search in Rotated Sorted Array
- C# ADO.NET操作数据库 SqlHelp.cs类
- 3.Repeater 绑定数据例子
- 前端面试题第二波,要offer的看过来~
- Oracle 10g体系结构及安全管理
- web中通过注释判断浏览器<;!--[if !IE]>;<;!--[if IE]>;<;!--[if lt IE 6]>;<;!--[if gte IE 6]>;版本
- Spring Boot 2.x整合Redis
- Qt之二进制兼容
- Boredom
- 关于我与小组成员逐步升级C代码时的一些感想【第二次作业】
- 基于UML网络教学管理平台模型的搭建
- ";BLAME"; is out.
- yii2的下载安装
- C#编程(七十九)---------- 反射
- 笔记 : 将本地项目上传到GitHub