蓝桥杯最短路径的四种方法

本文介绍了求解图中最短路径的四种算法:Dijkstra、Floyd、Bellman及SPFA。在面对不同场景时,选择合适的算法至关重要。Dijkstra适用于无负权边的单源最短路径;Floyd能处理负权边,但时间复杂度较高;Bellman算法用于含负权图,但效率较低;SPFA在存在负权边且对时间复杂度有要求时是较好的选择,但其稳定性不佳。

在这里插入图片描述

要求最短的路径,首先得把这些边都存储起来,边的存储有邻接表和邻接矩阵两种,这个题数据最大20万个,用邻接矩阵肯定不行,只能使用邻接表来存储。
求最短路的算法 Dijkstra,Floyd,Bellman,spfa;
这个题想要100%通过测试用例,只能使用效率高但是不是很稳定的spfa算法。
需要注意的是,初始化给所有路径的长度定义的无穷大这个数值,不能太大,也不能太小,比如说0x3fffffff,具体大小根据题中所给的边权的范围来定。

Dijkstra(迪杰斯特拉)算法

  • Dijkstra算法所求的是单源的最短路径,从起点开始,每一次都找到当前起点的最短可到达的点,然后再进行松弛。
  • 该算法在使用时要求所包括的边中不能有负权边。

这可以看出,原本A -> B最短路径应该是 1 ,如果存在负权边的话就变成了2

#define MAXN 1000 //最大顶点数
#define INF 0x3fffffff //一个很大的数 

int n = 0, m = 0, s = 0;//n为顶点数 m为边数 s为起点 
int d[MAXN] = {
   
   0}; //起点到各点最短路径的长度
int visit[MAXN] = {
   
   0};//记录已经找到的最短路径的点 0--》未找到  1--》表示找到
int arr[MAXN][MAXN] = {
   
   0}; //暂时用邻接矩阵来存储各个边

void Dijkstra()
{
   
   
	int i = 0;
	//初始化一步可以到达的路径长度 
	for(i = 0;i < n;i++)
	{
   
   
		if(arr[s][i])
		{
   
   
			d[i] = 	arr[s][i];
		}
		else
		{
   
   
			d[i] = INF;
		}
	}
	visit[s] = 1;//起点写进数组中
	d[s] = 0; //自己到自己的路径设置为0 

	for(i = 0;i < n; i++)
	{
   
   
		//找到一条最短的路 
		int j = 0,u = -1,min = INF;
		for(j = 0; j < n; j++)
		{
   
   
			//如果存在一条最短路径,并且该点没有被访问,更新min 和 u
			if(!visit[j] && d[j] < min)
			{
   
   
				u = j;
				min = d[j]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值