1. /**
  2. problem: http://poj.org/problem?id=3259
  3. spfa判负环:
  4. 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数)
  5. spfa双端队列优化:
  6. 维护队列使其dist小的点优先处理
  7. **/
  8. #include<stdio.h>
  9. #include<deque>
  10. #include<algorithm>
  11. using namespace std;
  12.  
  13. class Graphics{
  14. const static int MAXN = ;
  15. const static int MAXM = * + ;
  16. const static int INF = 0x7fffffff;
  17. private:
  18. struct Edge{
  19. int to, dist, next;
  20. }edge[MAXM];
  21. int first[MAXN], sign, sumOfPoint;
  22. public:
  23. void init(int n){
  24. sumOfPoint = n;
  25. for(int i = ; i <= n; i ++){
  26. first[i] = -;
  27. }
  28. sign = ;
  29. }
  30. void addEdgeOneWay(int u, int v, int w){
  31. edge[sign].dist = w;
  32. edge[sign].to = v;
  33. edge[sign].next = first[u];
  34. first[u] = sign ++;
  35. }
  36. void addEdgeTwoWay(int u, int v, int w){
  37. addEdgeOneWay(u, v, w);
  38. addEdgeOneWay(v, u, w);
  39. }
  40. bool spfaNegRing(int start){
  41. bool *vis = new bool[sumOfPoint+];
  42. int *dist = new int[sumOfPoint+];
  43. int *cnt = new int[sumOfPoint+];
  44. for(int i = ; i <= sumOfPoint; i ++){
  45. vis[i] = ;
  46. cnt[i] = ;
  47. dist[i] = INF;
  48. }
  49. deque<int> que;
  50. que.push_front(start);
  51. dist[start] = ;
  52. vis[start] = ;
  53. while(!que.empty()){
  54. int now = que.front();
  55. que.pop_front();
  56. vis[now] = ;
  57. for(int i = first[now]; i != -; i = edge[i].next){
  58. int to = edge[i].to, eDist = edge[i].dist;
  59. if(dist[now] + eDist < dist[to]){
  60. dist[to] = dist[now] + eDist;
  61. cnt[to] ++;
  62. if(cnt[to] >= sumOfPoint) { /// 如果这个点已经松弛n次则它必定是负环中的一个点
  63. delete []vis; delete []dist; return true;
  64. }
  65. if(!vis[to]){
  66. vis[to] = ;
  67. if(que.empty() || dist[to] <= dist[que.front()])
  68. que.push_front(to);
  69. else
  70. que.push_back(to);
  71. }
  72. }
  73. }
  74. }
  75. delete []vis; delete []dist; return false;
  76. }
  77. }graph;
  78.  
  79. int main(){
  80. int f;
  81. scanf("%d", &f);
  82. while(f --){
  83. int n, m, w;
  84. scanf("%d%d%d", &n, &m, &w);
  85. graph.init(n);
  86. while(m --){
  87. int s, e, t;
  88. scanf("%d%d%d", &s, &e, &t);
  89. graph.addEdgeTwoWay(s, e, t);
  90. }
  91. while(w --){
  92. int s, e, t;
  93. scanf("%d%d%d", &s, &e, &t);
  94. graph.addEdgeOneWay(s, e, -t);
  95. }
  96. printf("%s\n", graph.spfaNegRing() ? "YES" : "NO");
  97. }
  98. return ;
  99. }

poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)的更多相关文章

  1. POJ 3259 Wormholes(bellman_ford,判断有没有负环回路)

    题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前 ...

  2. 关于SPFA的双端队列优化

    7.11 Update 我做题的时候发现这样写会RE 因为在使用双端队列优化SPFA的时候 在将一个点加入队列的时候,如果队列已经空了 那么一旦出现dis[Q.front()]就会RE 可以这样修改 ...

  3. Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化

    设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子 转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就 ...

  4. ACM: POJ 3259 Wormholes - SPFA负环判定

     POJ 3259 Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu   ...

  5. POJ 3259 Wormholes(SPFA判负环)

    题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...

  6. POJ 3259 Wormholes SPFA算法题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  7. POJ 3259 Wormholes ( SPFA判断负环 && 思维 )

    题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...

  8. poj 3259 Wormholes spfa算法

    点击打开链接 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25582   Accepted: 9186 ...

  9. [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29971   Accepted: 10844 Descr ...

随机推荐

  1. Java线程入门第一篇

    Java线程的状态有6种 1.  初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2.  运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...

  2. Spring课程 Spring入门篇 5-3 配置切入点 pointcut

    1 解析 1.1 xml常见的配置切入点写法 2 代码演练 2.1 xml配置切入点   1 解析 1.1 xml常见的配置切入点写法 2 代码演练 2.1 xml配置切入点 xml配置: <? ...

  3. Datatable paging,Repeater with Paging

    /// <summary> /// 塗聚文 /// 20140225 /// </summary> public partial class DatatablePage : S ...

  4. scss-颜色运算符

    scss允许使用颜色分量以及算术运算和任何颜色表达式返回颜色值. 例如scss代码: $color1: #333399; $color2: #CC3399; p{ color: $color1 + $ ...

  5. javascript统计一个字符在一段字符串出现次数

      <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" ...

  6. 22_AOP_切面——静态切面

    [Spring AOP 如何定位连接点] 1.增强提供了连接点的方位信息:如织入到方法前面.后面等. 2.切点描述的是织入到哪些类的哪些方法上. [切点] Spring通过org.springfram ...

  7. VC++中对数据类型的限制limits.h文件内容

    limits.h文件中规定了是IDE在OS中规定了每个数据类型的最大值和最小值以及在程序源代码中编译时候所占用的字节数,这这样做有利于帮助程序员在编写程序的时候有效控制在选择合适数据类型的显示范围值. ...

  8. File GDB API

    bbs一问一答 https://blogs.esri.com/esri/arcgis/2010/12/13/file-geodatabase-api-details/ 下载页面 http://www. ...

  9. [工作积累点滴整理]虚拟化、云计算配置规划<一>

    目 录1. 服务器虚拟化的相关配置建议 11.1. 服务器的基本配置建议 11.1.1. CPU配置 11.1.2. 服务器内存配置 21.1.3. 物理网卡配置 21.1.4. 服务器磁盘配置 21 ...

  10. (阿里巴巴)数据库连接池——Druid (未完持续更新)

    Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...