1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本⾝的路径赋为 无穷大)。然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加⼊到队列最后。重复执⾏直到队列为空。
判断有⽆负环:如果某个点进⼊队列的次数超过 N 次则存在负环(SPFA ⽆法处理带负环的图)

方法一:链式前向星的写法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <queue>
#include <algorithm>
using namespace std;
const int maxx=5505;
const int inf=0x3f3f3f3f;
int head[maxx];
int vis[maxx];
int dist[maxx];
int n, m, w;
int cnt;
int num[maxx];
struct node{int v, w, next;
}edge[maxx];
void add(int u, int v, int w){edge[cnt].v = v;edge[cnt].w = w;edge[cnt].next = head[u];head[u] = cnt++;
}
int SPFA_min(){memset(vis, 0, sizeof(vis));memset(num, 0, sizeof(num));queue<int>Q;vis[1] = 1;dist[1] = 0;Q.push(1);num[1]++;while(Q.size()){int u=Q.front();Q.pop();vis[u] = 0;for(int i=head[u]; i!=-1; i=edge[i].next){int v = edge[i].v;if(dist[v] > dist[u] + edge[i].w){dist[v] = dist[u] + edge[i].w;if(!vis[v]){vis[v] = 1;Q.push(v);num[v] ++;if(num[v]>n)return 1;}}}}return 0;
}int main(){int T;scanf("%d", &T);while(T--){scanf("%d%d%d", &n, &m, &w);cnt = 0;memset(head, -1, sizeof(head));for(int i=1; i<=n; i++)dist[i] = inf;for(int i=1; i<=m; i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);add(a, b, cost);add(b, a, cost);}for(int i=1; i<=w; i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);add(a, b, -cost);}if( SPFA_min() )printf("YES\n");elseprintf("NO\n");}return 0;
}
方法二:邻接表的写法
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
const int maxx=1005;
const int inf=0x3f3f3f3f;
vector<int>G[maxx];
queue<int>q;
int dist[maxx];
int e[maxx][maxx];
int pre[maxx];
int vis[maxx];
int n,m,k;
int head[maxx];
int num[maxx];
int SPFA_min(int u){memset(dist,inf,sizeof(dist));memset(num,0,sizeof(num));q.push(u);vis[u]=1;dist[u]=0; num[u]++;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(dist[v]>dist[u]+e[u][v]){dist[v]=dist[u]+e[u][v];pre[v]=u;if(vis[v]==0){q.push(v);num[v]++;vis[v]=1;if(num[v]>n)return 1;}}}}return 0;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d %d",&n,&m,&k);memset(pre,0,sizeof(pre));memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){G[i].clear();}while(!q.empty()){q.pop();}memset(e,inf,sizeof(e));for(int i=1;i<=m;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);G[b].push_back(a);G[a].push_back(b);if(e[a][b]>cost){e[a][b]=e[b][a]=cost;}}for(int i=1;i<=k;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);G[a].push_back(b);e[a][b]=-cost;}if(SPFA_min(1)==1){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}}return 0;
}

poj3259(SPFA算法)相关推荐

  1. poj 3662 Telephone Lines spfa算法灵活运用

    意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...

  2. 图论-最短路径--3、SPFA算法O(kE)

    SPFA算法O(kE) 主要思想是:     初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束.     这个算 ...

  3. HDU3440(差分约束+SPFA算法)

    题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  4. poj2387(SPFA算法)

    1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本⾝的路径赋为 无穷大).然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所 ...

  5. 图论刷水题记录(二)(最短路-----SPFA算法)

    继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...

  6. SPFA算法O(kE)

    SPFA算法O(kE) Dijkstra和Floyed是不断的试点.Dijkstra试最优点,Floyed试所有点. Bellman-Ford和SPFA是不断的试边.Bellman-Ford是盲目的试 ...

  7. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

  8. 最短路径:Dijkstra、BellmanFord以及SPFA算法

    最短路径问题 1.Dijkstra算法 简介 (1)Dijkstra算法伪代码 (2)C++ 邻接表版代码 (3)优化 (4)题型分析 2.Bellman Ford算法 简介 (1)Bellman算法 ...

  9. 最短路径(Dijkstra、Bellman-Ford和SPFA算法)

    最短路径(Dijkstra.Bellman-Ford和SPFA算法) 前言 图的存储方式 邻接矩阵 邻接表 链表建立 利用vector 结构体 核心思路 Dijkstra算法 图解 基本思想 求解步骤 ...

  10. HDU SPFA算法 Invitation Cards

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1535 分析: 题意:求1点到其它点的最短距离之和+其它点到1点的最短距离之和 前面一部分直接用SPFA ...

最新文章

  1. 【OpenCV】图像/视频相似度测量PSNR( Peak signal-to-noise ratio) and SSIM,视频/图片转换
  2. 15.concurrent-control并发控制
  3. 关于flex布局的深入学习
  4. 和php结合实现分页js代码,无JS,完全php面向过程数据分页实现代码
  5. ubuntu忘记密码,忘记root密码的解决方法!【转载】
  6. 计算分词的Tf-idf值
  7. java多线程调度_Java多线程:生命周期,实现与调度
  8. ActivityGroup 例子
  9. MySQL8中文手册【持续更新】
  10. python qt教程视频 下载_PyQt5开发与实战教程,视频教程下载
  11. 拦截器与过滤器的区别
  12. redis-trib.rb操作命令
  13. windows ghost备份
  14. Vulkan学习(四):Shader加载 管线设置
  15. 前方高能!看小伙是怎么表白粉丝的
  16. Codeforces1575 D. Divisible by Twenty-Five(dp)
  17. 4p营销组合策略案例_营销组合策略的4P讲解
  18. HTTP的SSL 证书安装
  19. 【论文翻译】Learning from Few Samples: A Survey 小样本学习综述
  20. 亚马逊、沃尔玛自养号大额下单需要解决哪些问题?

热门文章

  1. CSS 背景(background)(背景颜色color、背景图片image、背景平铺repeat、背景位置position、背景附着、背景简写、背景透明、链接导航栏综合案例)
  2. 爬虫之requests模块在headers参数中携带cookie发送请求
  3. 如何用数据结构解释计算机系统 常用数据结构
  4. 复习计算机网络基础 day3---什么是计算机网络:
  5. 深度学习100问:什么是深监督(Deep Supervision)?
  6. 理解什么是MyBatis?
  7. Bzoj2337:[HNOI2011]XOR和路径
  8. Technavio:大数据即服务将迎快速增长期
  9. linux下gdb所有实用方法
  10. 链接详解--多目标文件的链接