/**
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 ;
}

最新文章

  1. UVa1592_数据库
  2. osg中遇到的问题
  3. Freemarker中通过request获得contextPath
  4. Maven——使用Maven构建多模块项目
  5. 第五章_PHP流程控制
  6. Java [leetcode 33]Search in Rotated Sorted Array
  7. C# ADO.NET操作数据库 SqlHelp.cs类
  8. 3.Repeater 绑定数据例子
  9. 前端面试题第二波,要offer的看过来~
  10. Oracle 10g体系结构及安全管理
  11. web中通过注释判断浏览器&lt;!--[if !IE]&gt;&lt;!--[if IE]&gt;&lt;!--[if lt IE 6]&gt;&lt;!--[if gte IE 6]&gt;版本
  12. Spring Boot 2.x整合Redis
  13. Qt之二进制兼容
  14. Boredom
  15. 关于我与小组成员逐步升级C代码时的一些感想【第二次作业】
  16. 基于UML网络教学管理平台模型的搭建
  17. &quot;BLAME&quot; is out.
  18. yii2的下载安装
  19. C#编程(七十九)---------- 反射
  20. 笔记 : 将本地项目上传到GitHub

热门文章

  1. select, poll, epoll笔记
  2. typeScript入门(四)泛型
  3. angular2-响应式表单
  4. 【起航计划 037】2015 起航计划 Android APIDemo的魔鬼步伐 36 App-&gt;Service-&gt;Remote Service Binding AIDL实现不同进程间调用服务接口 kill 进程
  5. file中mkdirs和mkdir的区别-文件上传
  6. python中文入库
  7. eclipse中copy qualified name使用方式
  8. day013-流
  9. day009-IO流
  10. ubuntu怎么关防火墙