一直觉得紫书代码比较精炼,就照着紫书上不完整的SPFA算法模板写了一道判断是否有负权边的题,题目链接:https://vjudge.net/problem/POJ-3259,细节看代码

之后我又用bellman算法跑了一遍发现比SPFA要快,可能原因是无向图的边要多一些吧

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include<iostream>
 6 #include<vector>
 7 #include<set>
 8 #include<queue>
 9 #define MAXN 500100
10 #define INF 0x3f3f3f3f
11 using namespace std;
12 typedef long long ll;
13 int n,m,w;
14 struct node
15 {
16     int from,to,cost;
17     node(int a,int b,int c):from(a),to(b),cost(c){}
18 };///边的结构体
19 vector<int>G[MAXN];///G[i]中的元素代表以i为起点的边
20 vector<node>edges;///存放所有的边
21 bool inq[MAXN];
22 int d[MAXN],cnt[MAXN];
23 bool SPFA(int s)
24 {
25
26     for(int i=0;i<=n;i++)d[i]=INF;
27     memset(inq,0,sizeof(inq));
28      memset(cnt,0,sizeof(cnt));///初始化
29     d[s]=0;
30     inq[s]=true;
31     queue<int> q;
32     q.push(s);
33     while(!q.empty())
34     {
35         int u=q.front();q.pop();
36         inq[u]=false;
37         for(int i=0;i<G[u].size();i++)///对以队首为起点的边进行松弛
38         {
39             node& e=edges[G[u][i]];
40             if(d[u]<INF&&d[e.to]>d[u]+e.cost)
41             {
42                 d[e.to]=d[u]+e.cost;
43                 if(!inq[e.to])///每松弛一个点加入队列
44                 {
45                     q.push(e.to);
46                     inq[e.to]=true;
47                     if(++cnt[e.to]>n)return false;///如果一个点被松弛n次以上说明有负环
48                 }
49             }
50         }
51     }
52     return true;
53 }
54 void AddEdge(int from,int to,int dist)
55     {
56         edges.push_back(node(from,to,dist));
57         int k = edges.size();
58         G[from].push_back(k-1);///初始化边,将他们编号
59     }
60 int main()
61 {
62     int t;
63     scanf("%d",&t);
64     while(t--)
65     {
66         scanf("%d%d%d",&n,&m,&w);
67         for(int i=1;i<MAXN;i++)G[i].clear();
68         edges.clear();
69         for(int i=0;i<m;i++)
70         {
71             int u,v,cost;
72             scanf("%d%d%d",&u,&v,&cost);
73             AddEdge(u,v,cost);AddEdge(v,u,cost);///这里路径是双向的(我这里被卡很久)
74         }
75         for(int i=0;i<w;i++)
76         {
77             int u,v,cost;
78             scanf("%d%d%d",&u,&v,&cost);
79             AddEdge(u,v,-cost);///虫洞权值为负,且为单向
80         }
81         if(!SPFA(1))printf("YES\n");
82         else printf("NO\n");
83     }
84     return 0;
85 }

转载于:https://www.cnblogs.com/megadeth/p/11318218.html

SPFA算法模板(刘汝佳版)--Wormholes POJ - 3259相关推荐

  1. 二叉树重建(前中序遍历求后序模板刘汝佳小白本)

    输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列. 输入: DBACEGF ABCDEFG BCAD CBAD 输出: ACBFGED CDAB #include<stdio.h&g ...

  2. 刘汝佳《算法竞赛入门经典(第二版)》习题(三)

    刘汝佳<算法竞赛入门经典(第二版)>第三章习题(一) 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分.每个 ...

  3. 刘汝佳《算法竞赛入门经典(第二版)》习题(六)

    刘汝佳<算法竞赛入门经典(第二版)>第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有 ...

  4. 刘汝佳《算法竞赛入门经典(第二版)》习题(二)

    刘汝佳<算法竞赛入门经典(第二版)>第二章习题 目录 刘汝佳<算法竞赛入门经典(第二版)>第二章习题 习题2-1 水仙花数 习题2-2 韩信点兵 习题2-3 倒三角形 习题2- ...

  5. 刘汝佳算法竞赛第二版习题3-2思路

    最近在看刘汝佳编写的紫皮算法书,第三章后面有个习题,尝试写了一下,总感觉能找到更加便利的解题方法,但能力有限没想到. 上网搜索了一下,也没找到能让我眼前一亮的方法,那就暂且把我写的shi山放出来让大伙 ...

  6. 刘汝佳《算法竞赛入门经典》---总结

    刘汝佳:<算法竞赛入门经典> 三步: 基本的数据结构+算法知识: 数论等数学基本知识: 锻炼联想建模能力.知识与实际相结合,解决实际问题! 第一章:程序设计入门 1.a/b 当a.b为整数 ...

  7. 算法竞赛入门经典(刘汝佳)——代码笔记

    Reference: <算法竞赛入门经典>(刘汝佳)第一版.第二版 ------------------------------------------------------------ ...

  8. 刘汝佳算法入门笔记(1)

    刘汝佳算法入门笔记 习题4-2 习题4-2 有n行n列(2≤n≤9)的小黑点,还有m条线段连接其中的一些黑点.统计这些线段连成 了多少个正方形(每种边长分别统计). 行从上到下编号为1-n,列从左到右 ...

  9. 对刘汝佳蓝书点双连通分量(BCC)模板的理解

    /*经过简单的使用,对刘汝佳的这个板做几个简单的说明:1.算法结束后每个bcc[i]里存入一个双连通分量的点的标号,其中割点也被存进去,也就是说割点可以属于多个双连通分量2.根据刘汝佳所说的点-双连通 ...

  10. 【刘汝佳】习题3-1 UVA1585

    刘汝佳 <算法竞赛入门经典(第二版)>第三章习题 3-1 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分. ...

最新文章

  1. nginx做方向代理不显示图片的问题
  2. 数据库服务器 之 在Linux下使用perl通过unixODBC连接SQLServer2000
  3. 创建 .m2 文件夹
  4. 如何向github提交更新
  5. cmd - 使用curl命令的注意点
  6. 用JSONObject解析和处理json数据
  7. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)
  8. centos开机卡进度解决方案
  9. Aliplayer自定义组件
  10. mysql 导出表数据
  11. 移动终端课程设计——校园淘二手交易APP
  12. Excel饼图中既显示百分比
  13. 设计模式之禅【状态模式】
  14. 高性能消息中间件 nsq 解析-介绍
  15. 手把手教小白部署vue教程
  16. “网络三结义”--mpls 进阶实验详细配置
  17. FM铁电存储器 eg:fm24cl16等等
  18. 易语言取java路径模块,511遇见易语言API模块进程创建CreateProcess
  19. 记录一些博客写作心得
  20. 骑车不戴头盔识别检测系统 Tesnorflow

热门文章

  1. css制作向下的三角形
  2. leetcode 51. N-Queens N 皇后(困难)
  3. GT9xxxxx系列------如何加入电源管理模块
  4. 大地高、正高和正常高
  5. IDEA 找不到或无法加载主类
  6. 无线路由器和计算机怎么连接网络连接,猫连接无线路由器
  7. 【Vegas原创】IPAD忘记密码重置恢复出厂设置
  8. 关于VLAN-tag
  9. wps打印预览工具栏消失_在WPS电子表格中看不到打印预览怎么办?
  10. 汇率战争下的人民币走势