SPFA算法模板(刘汝佳版)--Wormholes POJ - 3259
一直觉得紫书代码比较精炼,就照着紫书上不完整的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相关推荐
- 二叉树重建(前中序遍历求后序模板刘汝佳小白本)
输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列. 输入: DBACEGF ABCDEFG BCAD CBAD 输出: ACBFGED CDAB #include<stdio.h&g ...
- 刘汝佳《算法竞赛入门经典(第二版)》习题(三)
刘汝佳<算法竞赛入门经典(第二版)>第三章习题(一) 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分.每个 ...
- 刘汝佳《算法竞赛入门经典(第二版)》习题(六)
刘汝佳<算法竞赛入门经典(第二版)>第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有 ...
- 刘汝佳《算法竞赛入门经典(第二版)》习题(二)
刘汝佳<算法竞赛入门经典(第二版)>第二章习题 目录 刘汝佳<算法竞赛入门经典(第二版)>第二章习题 习题2-1 水仙花数 习题2-2 韩信点兵 习题2-3 倒三角形 习题2- ...
- 刘汝佳算法竞赛第二版习题3-2思路
最近在看刘汝佳编写的紫皮算法书,第三章后面有个习题,尝试写了一下,总感觉能找到更加便利的解题方法,但能力有限没想到. 上网搜索了一下,也没找到能让我眼前一亮的方法,那就暂且把我写的shi山放出来让大伙 ...
- 刘汝佳《算法竞赛入门经典》---总结
刘汝佳:<算法竞赛入门经典> 三步: 基本的数据结构+算法知识: 数论等数学基本知识: 锻炼联想建模能力.知识与实际相结合,解决实际问题! 第一章:程序设计入门 1.a/b 当a.b为整数 ...
- 算法竞赛入门经典(刘汝佳)——代码笔记
Reference: <算法竞赛入门经典>(刘汝佳)第一版.第二版 ------------------------------------------------------------ ...
- 刘汝佳算法入门笔记(1)
刘汝佳算法入门笔记 习题4-2 习题4-2 有n行n列(2≤n≤9)的小黑点,还有m条线段连接其中的一些黑点.统计这些线段连成 了多少个正方形(每种边长分别统计). 行从上到下编号为1-n,列从左到右 ...
- 对刘汝佳蓝书点双连通分量(BCC)模板的理解
/*经过简单的使用,对刘汝佳的这个板做几个简单的说明:1.算法结束后每个bcc[i]里存入一个双连通分量的点的标号,其中割点也被存进去,也就是说割点可以属于多个双连通分量2.根据刘汝佳所说的点-双连通 ...
- 【刘汝佳】习题3-1 UVA1585
刘汝佳 <算法竞赛入门经典(第二版)>第三章习题 3-1 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分. ...
最新文章
- nginx做方向代理不显示图片的问题
- 数据库服务器 之 在Linux下使用perl通过unixODBC连接SQLServer2000
- 创建 .m2 文件夹
- 如何向github提交更新
- cmd - 使用curl命令的注意点
- 用JSONObject解析和处理json数据
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)
- centos开机卡进度解决方案
- Aliplayer自定义组件
- mysql 导出表数据
- 移动终端课程设计——校园淘二手交易APP
- Excel饼图中既显示百分比
- 设计模式之禅【状态模式】
- 高性能消息中间件 nsq 解析-介绍
- 手把手教小白部署vue教程
- “网络三结义”--mpls 进阶实验详细配置
- FM铁电存储器 eg:fm24cl16等等
- 易语言取java路径模块,511遇见易语言API模块进程创建CreateProcess
- 记录一些博客写作心得
- 骑车不戴头盔识别检测系统 Tesnorflow