最短路问题 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 ...
随机推荐
- [转载] erp开发-数据查询优化方法
系统运行环境:MSSQL 2008随着公司业务快速发展,各种业务数据如火箭般的高速增长,出现一个又一个千万行数据的表,往往大表之间的关联,耗费系统大量的磁盘io,并且会影响正常的实时业务的操作,所以我 ...
- SQL SERVER 查看占用tempDB
use tempdb go t1.session_id, t1.internal_objects_alloc_page_count, t1.user_objects_alloc_page_count, ...
- python3 之视频抽针
import cv2 import os Path = "C:/Users/zl3269/Desktop/test/video/" # 视频的格式 /aisg-server/Dat ...
- Win10安装sqlserver2014打开显示黑色界面,mardown打开显示报错
问题描述: 我电脑从win7更新到win10以后就打开sqlserver2014显示黑色背景有问题,卸载了又装都是没有用 然后我又发现mardown也是有问题打开报告什么错误,忘记截图了,去网上找了个 ...
- 手动搭建Docker本地私有镜像仓库
实验环境:两个Centos7虚拟机,一个是Server,用作客户端,另一个是Registry,用作Docker私有镜像仓库. 基础配置 查看一下两台虚拟机的IP地址 Server的IP地址是192.1 ...
- linux上部署SpringBoot项目及遇到的问题
打开sftp步骤, 在显示的已连接的窗口上右键, 选择connect SFTP Session就可以打开文件上传的窗口 从windows上传文件到linux, 首先linux需要先切换到想要保存文件的 ...
- 【汤鸿鑫 3D太极】肩与膀的细分
- cookie 处理 以及模拟登陆
cookie的处理 1.手动处理: cookie封装到headers 2.自动处理: 1.获取一个session对象 2.使用session对象进行请求的发送 3.作用:在使用session进行请求发 ...
- POJ 3970(最小公倍数LCM)
版权声明:Site:https://skyqinsc.github.io/ https://blog.csdn.net/u013986860/article/details/26182055 知 ...
- UVA11846-Finding Seats Again(DFS)
Problem UVA11846-Finding Seats Again Accept: 69 Submit: 433Time Limit: 10000 mSec Problem Descrip ...