1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本⾝的路径赋为 无穷大)。然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加⼊到队列最后。重复执⾏直到队列为空。

方法一:SPFA算法
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxx=1000005;
const int inf=0x3f3f3f3f;
struct node{int u,v,w;int next;
}num[maxx];
struct V{int u,v,w;
}TV[maxx];
queue<int>q;
int dist[maxx];
int pre[maxx];
int vis[maxx];
int n,m,k;
int cnt;
int head[maxx];
void add(int u,int v,int w){num[cnt].v=v;num[cnt].next=head[u];num[cnt].w=w;head[u]=cnt++;
}
void SPFA_min(int u){memset(dist,inf,sizeof(dist));q.push(u);vis[u]=1;dist[u]=0; while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=num[i].next){int v=num[i].v;if(dist[v]>dist[u]+num[i].w){dist[v]=dist[u]+num[i].w;pre[v]=u;if(vis[v]==0){q.push(v);vis[v]=1;}}}}
}
void init(int n){cnt=1;memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));memset(head,-1,sizeof(head));while(!q.empty()){q.pop();}
}
int main(){int t;while(scanf("%d %d",&n,&m)!=EOF){init(n);for(int i=1;i<=n;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);add(a,b,cost);add(b,a,cost);}SPFA_min(m);cout<<dist[1]<<endl;}return 0;
}
方法二:Dijstra算法
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxx=1005;
const int inf=0x3f3f3f3f;
int dist[maxx];
int pre[maxx];
int vis[maxx];
int e[maxx][maxx];
int n,m,k;
void Dijstra(int n,int u){for(int i=1;i<=n;i++){dist[i]=e[u][i];pre[i]=u;}dist[u]=0;vis[u]=1;for(int i=1;i<=n;i++){int temp=inf;int t=u;for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]<temp){temp=dist[j];t=j;}}if(t==u)break;vis[t]=1;for(int j=1;j<=n;j++){if(e[t][j]<inf){if(!vis[j]&&dist[j]>dist[t]+e[t][j]){dist[j]=dist[t]+e[t][j];pre[j]=t;}}}}
}
int main(){int t;while(scanf("%d %d",&n,&m)!=EOF){memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));memset(vis,0,sizeof(vis));for(int i=1;i<=m;i++){dist[i]=inf;for(int j=1;j<=m;j++){e[i][j]=inf;}}for(int i=1;i<=n;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);if(e[a][b]>cost){e[a][b]=e[b][a]=cost;}}Dijstra(m,m);cout<<dist[1]<<endl;}return 0;
}
方法三:Floyd算法-超时
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxx=1005;
const int inf=0x3f3f3f3f;
int dist[maxx];
int pre[maxx];
int vis[maxx];
int e[maxx][maxx];
int n,m,k;
void Floyd(int n){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){e[i][j]=min(e[i][j],e[i][k]+e[k][j]);}}}
}
int main(){int t;while(scanf("%d %d",&n,&m)!=EOF){memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));memset(vis,0,sizeof(vis));for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){e[i][j]=inf;}}for(int i=1;i<=n;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);if(e[a][b]>cost){e[a][b]=e[b][a]=cost;}}Floyd(m);cout<<e[1][m]<<endl;}return 0;
}
方法四:Bellman-ford()算法#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxx=5000005;
const int inf=0x3f3f3f3f;
struct node{int u,v,w;
}num[maxx];
int dist[maxx];
int pre[maxx];
int n,m,k;
void Bellman_ford(int m,int n){for(int i=1;i<=n;i++){dist[i]=inf;}dist[n]=0;for(int i=1;i<=n-1;i++){for(int j=1;j<=m;j++){if(dist[num[j].u]!=inf&&dist[num[j].v]>dist[num[j].u]+num[j].w){dist[num[j].v]=dist[num[j].u]+num[j].w;pre[num[i].v]=num[i].u;}}}
}
int main(){int t;while(scanf("%d %d",&n,&m)!=EOF){memset(pre,0,sizeof(pre));int j=0;for(int i=1;i<=n;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);j++;num[j].u=a;num[j].v=b;num[j].w=cost;j++;num[j].u=b;num[j].v=a;num[j].w=cost;}Bellman_ford(j,m);cout<<dist[1]<<endl;}return 0;
}

poj2387(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. 图论刷水题记录(二)(最短路-----SPFA算法)

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

  5. SPFA算法O(kE)

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

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

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

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

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

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

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

  9. HDU SPFA算法 Invitation Cards

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

最新文章

  1. java heep space错误解决办法
  2. jMeter 里如何调用函数 function
  3. oracle容错,Oracle DML容错处理方法
  4. java如何存储一个向量到一个矩阵的一个位置_SIMD数据并行(一)——向量体系结构...
  5. 【慢慢学算法】:奇偶校验(bitset使用)
  6. Element-ui中table使用row-class-name无效的锅
  7. 技术人 | 为什么我们的系统会如此复杂?
  8. 将本地图片生成一个网页链接(markdown)
  9. TAPD关联Jenkins
  10. 2018年看书计划(40本)
  11. 基于单片机的加油机系统
  12. excel中添加有效性验证或数据验证时不选择第一行列标题的解决方法
  13. 激光导引头电子舱测试系统软件的研究与开发
  14. uniapp使用Vant ui
  15. 学生成绩管理系统设计
  16. 高新技术企业认定条件及流程
  17. 蓝桥杯2017年第八届真题-对局匹配
  18. 湖南发现外星智慧创造人类证据(图)
  19. 分治法、动态规划、贪心算法区别
  20. Shell正则表达式 三剑客之grep

热门文章

  1. Vue之Todolist案例和ES6语法
  2. 文档相似度之词条相似度word2vec、及基于词袋模型计算sklearn实现和gensim
  3. 基于自适应策略转移的深度强化学习
  4. OpenCV图像旋转的原理与技巧
  5. 基于图形剪切的图像分割
  6. C++——创建类的时候用new与不用new 的区别(转)
  7. 2018年8月以太坊DApp数据分析报告
  8. 我的puppet web 管理,彻底告别终端模式
  9. 如何在同一台电脑开启多个tomcat服务器
  10. 压缩工具gzip,bzip2,xz,zip,tar