最短路问题 Floyd+Dijkstra+SPFA
参考博客:https://blog.csdn.net/qq_35644234/article/details/60875818
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2544
例题 hdu 2544
解法1.Dijkstra
复杂度为o(n*n) n为点的个数
从1点开始贪心地寻找最佳距离
可以求出1号点到其它点的最短距离
核心:拿出某个点时,它得到了最短路径
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=105;
const int INF=1e9+10;
bool ins[maxn];
int ma[maxn][maxn];
int dis[maxn];
int n,m;
void dijkstra()
{ memset(ins,0,sizeof(ins));
for(int i=2;i<=n;i++)
dis[i]=ma[1][i];
dis[1]=0;
ins[1]=1;
while(1)
{
int minn=INF,index;
for(int i=1;i<=n;i++)
{
if(ins[i]==0&&dis[i]<minn)
{
minn=dis[i];index=i;
}
}
if(minn==INF)break;
ins[index]=1;
for(int i=1;i<=n;i++)
{
if(ins[i]==0&&ma[index][i]+dis[index]<dis[i])
dis[i]=ma[index][i]+dis[index];
}
}
printf("%d\n",dis[n]); }
int main()
{ while(scanf("%d %d",&n,&m)==2)
{
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ma[i][j]=INF;
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
ma[a][b]=min(c,ma[a][b]);
ma[b][a]=min(c,ma[b][a]);
}
dijkstra();
}
return 0;
}
解法2.Floyd
复杂度o(n*n*n)
每次插入1个点,更新整个矩阵
可以求出两两之间的最短路径
#include<iostream>
#include<cstdio>
using namespace std;
const int INF=1e9+10;
const int maxn=105;
int ma[maxn][maxn];
int n,m;
void floyd()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
ma[j][k]=min(ma[j][k],ma[j][i]+ma[i][k]);
}
printf("%d\n",ma[1][n]);
}
int main()
{
while(scanf("%d %d",&n,&m)==2)
{
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ma[i][j]=INF;
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
ma[a][b]=min(ma[a][b],c);
ma[b][a]=min(ma[b][a],c);
}
floyd();
}
return 0;
}
解法3.SPFA
复杂度o(n*v) v为图中边的个数
贪心从1点寻找最短距离
优点是可以计算带有负边的图,缺点,复杂度高
核心:拿出某个点时,它不一定是最优,但可能会松弛其它点
注意:spfa函数中最好使用普通队列,优先队列反而更慢,因为根本是多此一举,每个弹出来的点不一定就是最短的了,所以它可能还是会进入队列
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=110;
const int INF=1e9+10;
int ma[maxn][maxn],dis[maxn];
bool ins[maxn];
int n,m;
struct Node{
int x;
bool operator < (const Node &a)const
{
return dis[x]<dis[a.x];
}
Node(int a)
{
x=a;
}
};
void spfa()
{
for(int i=1;i<=n;i++)ins[i]=0;
queue<Node>que;
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[1]=0;
que.push(Node(1));
while(que.size())
{
int x=que.front().x;
que.pop();
ins[x]=0;
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[x]+ma[x][i])
{
dis[i]=dis[x]+ma[x][i];
if(ins[i]==0)
{
ins[i]=1;
que.push(Node(i));
}
}
}
}
printf("%d\n",dis[n]);
}
int main()
{
while(scanf("%d %d",&n,&m)==2)
{
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ma[i][j]=INF;
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
ma[a][b]=min(ma[a][b],c);
ma[b][a]=min(ma[b][a],c);
}
spfa();
}
return 0;
}
最短路问题 Floyd+Dijkstra+SPFA的更多相关文章
- hdu 2066 ( 最短路) Floyd & Dijkstra & Spfa
http://acm.hdu.edu.cn/showproblem.php?pid=2066 今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以 ...
- hdu1595 最短路问题(dijkstra&&spfa)
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- 最短路问题(Bellman/Dijkstra/Floyd)
最短路问题(Bellman/Dijkstra/Floyd) 寒假了,继续学习停滞了许久的算法.接着从图论开始看起,之前觉得超级难的最短路问题,经过两天的苦读,终于算是有所收获.把自己的理解记录下来,可 ...
- 最短路(floyd/dijkstra/bellmanford/spaf 模板)
floyd/dijkstra/bellmanford/spaf 模板: 1. floyd(不能处理负权环,时间复杂度为O(n^3), 空间复杂度为O(n^2)) floyd算法的本质是dp,用dp[k ...
- PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)
题目大意:原题链接 给你一张图,初始你在房间1,初始生命值为100,进入每个房间会加上那个房间的生命(可能为负),问是否能到达房间n.(要求进入每个房间后生命值都大于0) 解题思路: 解法一:Floy ...
- 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)
几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3). Floyd-Warshall算法(Floyd ...
- POJ 1502 MPI Maelstrom( Spfa, Floyd, Dijkstra)
题目大意: 给你 1到n , n个计算机进行数据传输, 问从1为起点传输到所有点的最短时间是多少, 其实就是算 1 到所有点的时间中最长的那个点. 然后是数据 给你一个n 代表有n个点, 然后给你一 ...
- Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template
Dijkstra in Adjacency matrix : int Dijkstra(int src,int tec, int n){ ]; ]; memset(done,,sizeof(done) ...
- 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)
Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i ...
随机推荐
- NVIDIA显卡笔记本安装ubuntu驱动以及分辨率之详解
随着对ubuntu的了解,突然想在自己的笔记本上装一个双系统.在网上查了安装方法之后,发现因为nvidia显卡的原因会出现一些问题,结果在我自己装了之后发现问题要比看到的多,再看了无数个帖子之后,最终 ...
- Winform知识汇总之多次绑定DataGridView的DataSource会报错 NullReferenceExcepti
最近做了一个winform的项目,数据绑定在datagridview中,datagridview中的数据需要删除,分页,更新等之类的操作,所以就涉及到了datagridview的重新绑定问题,而且这些 ...
- MySQL高级知识(十)——批量插入数据脚本
前言:使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用. 0.准备 #1.创建tb_dept_bigdata(部门表). create table tb_dept_bigdata( ...
- php面试题整理(一)
str_split() print_r(str_split("Shanghai"));Array ( [0] => S [1] => h [2] => a [3] ...
- bootstrap-table 分页
bootstrap-table <!DOCTYPE html> <head> <meta charset="UTF-8"/> <tit ...
- Spring Boot+Spring Security+JWT 实现 RESTful Api 权限控制
摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的.现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能 ...
- redis配置环境变量
直接上图不解释 redis安装路径,我的电脑右击属性 窗口+R键,输入cmd回车,输入redis-server.exe 回车 再开一个命令窗口,窗口+R键,输入cmd回车,输入 redis-cli. ...
- 七、Oracle 数据库设计
1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体. 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证 ...
- 01-Jenkins-Master节点安装
Jenkins安装前需要JDK8,下载最新版本的Jenkins LTS 2.150.防止下载缓慢可以通过清华源进行下载. [root@node1 ~]# wget https://mirrors.tu ...
- BZOJ3309 DZY Loves Maths 莫比乌斯反演、线性筛
传送门 推式子(默认\(N \leq M\)): \(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^Mf(gcd(i,j)) & = ...