图论之最短路

本文介绍了图论中的最短路问题,包括邻接矩阵和邻接表的存储方式,以及多种求解算法:朴素Dijkstra算法、堆优化Dijkstra算法、Bellman-Ford算法和SPFA算法。通过实例详细解析了每个算法的适用场景、复杂度和具体实现,帮助理解如何解决单源最短路径问题。
摘要由CSDN通过智能技术生成

一在求最短路前我们来看看图的存储

1.邻接矩阵的建立:

int n,g[N][N];//n个点,对于g[x][y]表示起点x到终点y的边权(有向边)
g[x][y]=g[y][x]=z;//无向边的处理
g[x][y]=min(g[x][y],z);//重边的处理(最短路只保留最短的一条边即可)

2.邻接表的建立:

int head[N],ne[M],ver[M],edge[M],idx;
//邻接表的建立
void add(x,y,z)
{
    idx++; ver[idx]=y,edge[idx]=z,ne[idx]=head[x],head[x]=idx;
}
//无向边的处理:
add(x,y,z),add(y,x,z)

x表示起点,y表示终点,z表示这条边的边权,N表示最大范围的点数,M表示最大边数,

add操作同数组模拟单链表类似,ver终点集合,head起点集合,ne指向下一个标号,edge表示边,它们通过同一个idx统一,

朴素Dijkstra算法(邻接矩阵存)

适用情况:求s号点到图中其他所有点的最短距离   O(n^2)

int d[N];//表示从某一点到当前距离是多少
bool v[N];//判断每个点的最短路是否已经确定了

算法步骤:

1.初始化将dist置为无穷大,v默认false,起点到自己的距离默认为0

2.进行n次循环,在每一次循环中都要确定s到一个还没有确定最短距离点的最短距离(那么n次循环就能确定n个点的最短距离)

即,先找到x<--找到不在st中的距离最近的点,再用这个点更新到其他点的距离

d[y]=min(d[y],d[x]+a[x][y]);//表示s到y的之前确定的距离和s到x再到y的距离的更小

现在我们来看看题目:

给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值,求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1
输入:
第一行:n(1~500)和m(1~10000)
接下来m行 x,y,z:点x和点y间存在一条有向边,边长为z
输出:
一个整数,表示1号点到n号点的最短距离
若路径不存在,则输出-1
边长均不超过10000

3 3
1 2 2
2 3 1
1 3 4

3

#include<iostrea
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值