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

本题事实上也能够使用SPFA算法来求解的,只是就一个关键点,就是当某个顶点入列的次数超过全部顶点的总数的时候,就能够推断是有负环出现了。

SPFA原来也是能够处理负环的。

只是SPFA这样的处理负环的方法自然比一般的Bellman Ford算法要慢点了。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <limits.h>
  4. const int MAX_N = 501;
  5. const int MAX_M = 2501;
  6. const int MAX_W = 201;
  7. struct Edge
  8. {
  9. int src, des, wei, next;
  10. //Edge(int s, int d, int w) : src(s), des(d), wei(w) {}
  11. };
  12. Edge edge[(MAX_M<<1)+MAX_W];
  13. int dist[MAX_N];
  14. int head[MAX_N];
  15. bool vis[MAX_N];
  16. int qu[MAX_N];
  17. int cnt[MAX_N];
  18. int totalEdges;
  19. inline void insertEdge(int src, int des, int wei)
  20. {
  21. edge[totalEdges].src = src, edge[totalEdges].des = des;
  22. edge[totalEdges].wei = wei; edge[totalEdges].next = head[src];
  23. head[src] = totalEdges++;
  24. }
  25. int N, M, W, F;
  26. bool cycleSPFA()
  27. {
  28. for (int i = 1; i <= N; i++) dist[i] = INT_MAX;
  29. dist[1] = 0;
  30. memset(vis, 0, sizeof(bool)*(N+1));
  31. memset(cnt, 0, sizeof(int)*(N+1));
  32. int top = 0, tail = 1; //循环队列的头和尾下标
  33. qu[top] = 1;
  34. vis[1] = true;
  35. cnt[1] = 1;
  36. while (top < tail)
  37. {
  38. int u = qu[top%MAX_N]; //自己定义循环队列
  39. top++;
  40. vis[u] = false;
  41. for (int e = head[u]; e ; e = edge[e].next)
  42. {
  43. int v = edge[e].des;
  44. if (dist[u]+edge[e].wei < dist[v])
  45. {
  46. dist[v] = dist[u]+edge[e].wei;
  47. if (!vis[v])
  48. {
  49. vis[v] = true;
  50. qu[tail%MAX_N] = v;
  51. tail++;
  52. cnt[v]++; //记录入列次数
  53. if (cnt[v] >= N) return true;
  54. }
  55. }
  56. }
  57. }
  58. return false;
  59. }
  60. int main()
  61. {
  62. int src, des, wei;
  63. scanf("%d", &F);
  64. while (F--)
  65. {
  66. scanf("%d %d %d", &N, &M, &W);
  67. memset(head, 0, sizeof(int) * (N+1));
  68. totalEdges = 1;
  69. for (int i = 0; i < M; i++)
  70. {
  71. scanf("%d %d %d", &src, &des, &wei);
  72. insertEdge(src, des, wei);
  73. insertEdge(des, src, wei);
  74. }
  75. for (int i = 0; i < W; i++)
  76. {
  77. scanf("%d %d %d", &src, &des, &wei);
  78. insertEdge(src, des, -wei);
  79. }
  80. if (cycleSPFA()) puts("YES");
  81. else puts("NO");
  82. }
  83. return 0;
  84. }

POJ 3259 Wormholes SPFA算法题解的更多相关文章

  1. poj 3259 Wormholes spfa算法

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

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

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

  3. poj - 3259 Wormholes (bellman-ford算法求最短路)

    http://poj.org/problem?id=3259 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W ...

  4. POJ 3259 Wormholes(SPFA判负环)

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

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

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

  6. 最短路(Bellman_Ford) POJ 3259 Wormholes

    题目传送门 /* 题意:一张有双方向连通和单方向连通的图,单方向的是负权值,问是否能回到过去(权值和为负) Bellman_Ford:循环n-1次松弛操作,再判断是否存在负权回路(因为如果有会一直减下 ...

  7. POJ 3259 Wormholes(最短路径,求负环)

    POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...

  8. POJ 3259 Wormholes (Bellman_ford算法)

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  9. POJ 3259 Wormholes(SPFA)

    http://poj.org/problem?id=3259 题意 : 农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地, ...

随机推荐

  1. H5 网站支付宝支付(前端部分)包含微信浏览器中的处理方法。

    手机网站唤起支付宝支付: H5 网站实现支付宝支付是一个很常见的需求: 实现方式主要是在后台配置和预支付, 前端需要做的就是唤起 支付宝App 然后就可以输入密码支付. 这个其实难度很低, 主要就是在 ...

  2. spring cloud:feign-hystrix

    producer 1. File-->new spring starter project 2.add dependency       <dependency> <group ...

  3. Java 实现日期 Date 的赋值

    关键的语句也就三句话: (1) SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd"); (2) Date ...

  4. JPA使用中遇到Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: XXX is not mapped

    在写自定义查询时,Query注解中写的JPQL,表名和列名都应该是映射的Java类和属性,不能写表名或者字段名

  5. @清晰掉 sprintf sscanf双胞胎

    sprintf() 格式化输出函数(图形) 功能: 函数sprintf()用来作格式化的输出.用法: 此函数调用方式为int sprintf(char *string,char *format,arg ...

  6. Oracle JET Router 与 Module 数据传递

    Oracle JET 组件间数据传递方法. 路由:父路由:customers Router  子路由: cust Router 这里 Router 和 module 结合使用. customer 包括 ...

  7. SecureCRT使用+堡垒机简单使用

    写在前面的话 自从升级为宝妈后,回来发现好多东西都遗忘了.熟话说:好记性不如烂笔头,我还是记录下来吧. 堡垒机使用的几个技巧 1.快捷操作         1) 输入 ID 直接登录.         ...

  8. 省市区,级联查询,ajaxgird,ajaxfrom

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. 面试题:String类通用构造,拷贝构造,析构,赋值函数实现

    已知 String 类定义如下: class String { public: //通用构造函数 String(const char* str = NULL); //拷贝构造函数 String(con ...

  10. lgb参数及调参

    1 参数含义 max_depth: 设置树的最大深度,默认为-1,即不限制最大深度,它用于限制过拟合 num_leave: 单颗树的叶子数目,默认为31 eval_metric: 评价指标,可以用lg ...