参考博客: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的更多相关文章

  1. hdu 2066 ( 最短路) Floyd & Dijkstra & Spfa

    http://acm.hdu.edu.cn/showproblem.php?pid=2066 今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以 ...

  2. hdu1595 最短路问题(dijkstra&&spfa)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  3. 最短路问题(Bellman/Dijkstra/Floyd)

    最短路问题(Bellman/Dijkstra/Floyd) 寒假了,继续学习停滞了许久的算法.接着从图论开始看起,之前觉得超级难的最短路问题,经过两天的苦读,终于算是有所收获.把自己的理解记录下来,可 ...

  4. 最短路(floyd/dijkstra/bellmanford/spaf 模板)

    floyd/dijkstra/bellmanford/spaf 模板: 1. floyd(不能处理负权环,时间复杂度为O(n^3), 空间复杂度为O(n^2)) floyd算法的本质是dp,用dp[k ...

  5. PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)

    题目大意:原题链接 给你一张图,初始你在房间1,初始生命值为100,进入每个房间会加上那个房间的生命(可能为负),问是否能到达房间n.(要求进入每个房间后生命值都大于0) 解题思路: 解法一:Floy ...

  6. 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)

    几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd ...

  7. POJ 1502 MPI Maelstrom( Spfa, Floyd, Dijkstra)

    题目大意: 给你 1到n ,  n个计算机进行数据传输, 问从1为起点传输到所有点的最短时间是多少, 其实就是算 1 到所有点的时间中最长的那个点. 然后是数据 给你一个n 代表有n个点, 然后给你一 ...

  8. Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template

    Dijkstra in Adjacency matrix : int Dijkstra(int src,int tec, int n){ ]; ]; memset(done,,sizeof(done) ...

  9. 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

    Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i ...

随机推荐

  1. parent.fraInterface.xxxxxx

    fraInterface是自己定义的一个frame的名字,是通过在frame标签中设置name属性实现的.以上那句代码就是通过parent这个公共接口在各个frame间,也就是调用拥有同一个父亲的名为 ...

  2. 智能合约 solidity 开发的环境基本搭建

    以太坊Dapp开发快速入门 以太坊为开源社区,虽然设计东西都很优秀,但是组件十分的杂乱,因此下面首先简单介绍下以太坊的一些常用组件以及各种工具介绍 Geth Geth是由以太坊基金会提供的官方客户端软 ...

  3. LeetCode算法题-Fizz Buzz(Java实现)

    这是悦乐书的第221次更新,第233篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第88题(顺位题号是412). 编写一个程序,输出从1到n的数字的字符串表示.但对于三的 ...

  4. 寒假训练——搜索 K - Cycle

    A tournament is a directed graph without self-loops in which every pair of vertexes is connected by ...

  5. Matplotlib 绘图 用法

    Matplotlib基础知识 一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis 水平和垂直的轴线 x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括 ...

  6. Your kernel does not support swap limit capabilities.memory limit without swap

    原因是:由于内核不支持限制内存的设置 解决办法是:vim /etc/default/grub 修改为: 或者:GRUB_CMDLINE_LINUX="cgroup_enable=memory ...

  7. centos7下安装docker(15.1跨主机网络)

    之前学习了单个host上的网络,我们知道单个host上的网络有:none,host,bridge和joined,他们解决了单个host上面的容器通信的问题:接下来我们讨论跨主机间容器通信的方案 跨主机 ...

  8. WPF DataGrid 列宽填充表格方法

    WPF中使DataGrid 列宽填充表格方法,设置ColumnWidth属性为ColumnWidth="*"即可. 源码: <DataGrid AutoGenerateCol ...

  9. Access restriction: The type 'BASE64Encoder'

    Access restriction: The type 'BASE64Encoder' is not API (restriction on required library 'D:\Java\jd ...

  10. oracle 乘积的实现方法

    with abc(col1) as ( ' from dual union all ' from dual union all ' from dual ) select col1,ln(col1),e ...