单源最短路径算法

[算法导论笔记]--单源最短路径 本文所贴示的伪代码均来源《算法导论》,本文只是对其中《单源最短路径》章节的简单总结,许多数学证明过程已忽略。 前言 最短路径的定义:给定一个图G=(V,E),希望找到从给定源节点s∈V 到每个结点v∈V 的最短路径。 单源最短路径可以用来解决许多其他问题,包括: 1、单目的地最短路径问题:找到从每个结点v到给定目的结点t的最短路径,如果将图的每条边的方向翻转过来,就可以将这个问题转换为单源... 阅读详情

Dijkstra

可以用优先队列优化到O(mlogn)O(mlogn)O(mlogn)的时间复杂度。

注意!Dijkstra算法只能处理正边权!负边权要用SPFA!

代码(优先队列优化):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct st
{
	int to;
	int dis;
	int nxt;
}
edge[500010];
int head[10010],size;
void add(int from,int to,int dis)
{
	edge[++size].nxt=head[from];
	edge[size].to=to;
	edge[size].dis=dis;
	head[from]=size;
}
void init()
{
	memset(head,-1,sizeof(head));
	memset(edge,-1,sizeof(edge));
}
struct node
{
	int dis,d;
	bool operator < (const node &x)const
	{
		return x.dis<dis;
	}
};
priority_queue<node> q;
int n,m,s;
int u,v,w;
int b[10010];
int dis[10010];
void dij()
{
	priority_queue<node> q;
	for(int i=1;i<=n;i++)
		dis[i]=(1<<31)-1;
	dis[s]=0;
	q.push((node){0,s});
	while(!q.empty())
	{
		node t=q.top();
		q.pop();
		u=t.d;
		if(b[u])
			continue;
		b[u]=1;
		for(int i=head[u];~i;i=edge[i].nxt)
		{
			v=edge[i].to,w=edge[i].dis;
			if(b[v])
				continue;
			if(dis[u]+w<dis[v])
			{
				dis[v]=dis[u]+w;
				q.push((node){dis[v],v});
			}
		}
	}
}
int main()
{
	init();
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	dij();
	for(int i=1;i<=n;i++)
		printf("%d ",dis[i]);
	return 0;
}

SPFA

注意!SPFA可能会被卡到O(mn)O(mn)O(mn)(网格图),在没有负边权的情况下尽量用Dijkstra!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct st
{
	int to;
	int dis;
	int nxt;
}
edge[500010];
int head[10010],size;
void add(int from,int to,int dis)
{
	edge[++size].nxt=head[from];
	edge[size].to=to;
	edge[size].dis=dis;
	head[from]=size;
}
void init()
{
	memset(head,-1,sizeof(head));
	memset(edge,-1,sizeof(edge));
}
int n,m,s;
int u,v,w;
int b[10010];
int dis[10010];
void spfa()
{
	queue<int> q;
	for(int i=1;i<=n;i++)
		dis[i]=(1<<31)-1;
	dis[s]=0;
	b[s]=1;
	q.push(s);
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		b[u]=0;
		for(int i=head[u];~i;i=edge[i].nxt)
		{
			v=edge[i].to,w=edge[i].dis;
			if(dis[u]+w<dis[v])
			{
				dis[v]=dis[u]+w;
				if(!b[v])
				{
					q.push(v);
					b[v]=1;
				}
			}
		}
	}
}
int main()
{
	init();
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	spfa();
	for(int i=1;i<=n;i++)
		printf("%d ",dis[i]);
	return 0;
}
【算法】单源最短路径算法——Dijkstra算法 Dijkstra算法 阅读详情

相关推荐

【算法】单源最短路径——dijkstra算法

一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。 dijkstra算法简介 迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 需要注意的是,dij

Reimia的博客 3万+

单源最短路径(Dijkstra算法)

迪杰斯特拉(Dijkstra)算法 定义 Dijkstra(迪杰斯特拉)算法是计算单源最短路径算法,用于计算一个结点到其他所有结点的最短路径。该算法以源点为起始点,不断更新其他点到已经确定距离结点的距离,选取距离最小的结点加入S集合,直到S集合存放有所有的结点 算法思想 现在一张图中有n个结点,有两个集合,S集合和V集合。S集合表示已经选取的结点,V集合表示还没有选取的结点 确定一个源点,放入S...

长期更新自学笔记 2万+

数据结构:单源最短路径--Dijkstra算法

单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离。指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题。 Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法。该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点。 算法思想 带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合。假设V0是源点,则初始 S={V0}。

CCPP Blog 1万+

算法导论-上课笔记11:单源最短路径

找到从源结点s到图G中每个结点v的最短路径

我是一只小嵩鼠 4247

0024算法笔记——【贪心算法】单源最短路径问题

1、问题描述      给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。     2、Dijkstra算法      Dijkstra算法是解单源最短路径问题的贪心算法。     其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个

liufeng_king的专栏 3万+

贪心算法——单源最短路径

1.算法描述        给定一个带权有向图G={V,E},以及V中的一个顶点,称为源,计算从源到其他各顶点的最短路径。 2.Dijkstra算法        Dijkstra算法是解单源最短路径的一个贪心算法,其主要思想是:设置顶点集合S,并不断地扩充该集合S,一个点可以归并到该集合的充要条件是该点到源点的距离已知。用数组dist记录目前所有点到该点的最短路径,循环依次找出不在该集合中

ssd_dai的博客 1679

dijkstra算法求单源最短路径算法代码coding

dijsktra算法求单源最短路径

qq_39743377的博客 926

算法——单源最短路径:Bellman-Ford算法、Dijkstra算法

前言 在最短路径问题中,约定

关注校招求职,微信号:job_campus 3282

四种单源最短路径算法

&nbsp; 一、最短路径问题描述 单源最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称之为源。现在要计算从源到其他各顶点的最短路径的长度。这里的路径长度指的是到达路径各边权值之和。 二、算法 1&nbsp; Dijkstra算法介绍 Dijkstra算...

M_Lter的博客 1万+

贪心算法——单源最短路径(Dijkstra算法)

单源最短路径——Dijkstra算法问题描述对于给定的加权有向图G(加权邻接数组表示),它的每一条边(i,j)都有一个固定成本(权值)a[i][j],一条路径的长度就是该路径上所有边的的成本之和。如下图所示,路径124的长度是8,路径125的长度是9。 寻找一条从给定的一个源顶点出发到任意顶点的(目的顶点)的最短路径。如1到5的最短路径为1345。贪心法求解根据贪婪法,每一步生成一条当前顶点的最短

Mind_V的博客 3361

(UE5 5.2)HISM Mobile DrawInstance在渲染层的实现浅分析

在 (UE4 4.27) UHierarchicalInstancedStaticMesh(HISM)原理分析 这篇博客大致介绍HISM组件从游戏线程到渲染线程的重建KD-Tree和剔除并提交DrawCall逻辑,但是没有分析渲染层的大致数据结构和实现. 可以看出FHierarchicalStaticMeshSceneProxy 实际存储Instance数组数据来自于FInstancedStaticMeshSceneProxy FHierarchicalStaticMeshSceneProxy只是以FClu

qq_29523119的博客 2725

JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

一,概念单源最短路径给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。dijkstra算法简介迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心...

weixin_28878311的博客 1861

STM32H743内存告急?手把手教你用CubeMX+FMC外扩32MB SDRAM(W9825G6KH-6)

本文详细介绍了如何在STM32H743上使用CubeMX和FMC外扩32MB SDRAM(W9825G6KH-6),解决内存不足问题。从硬件选型、CubeMX配置到初始化代码实现,提供完整的配置教程和性能优化技巧,帮助开发者高效扩展内存,适用于图形界面和复杂算法处理。

weixin_30568591的博客 493

6.9.单源最短路径问题-BFS算法

以上述图片为例,比如从G港到Y城,可以是G港->R城->Y城,也可以是G港->P城->Y城等,有很多条路径都可以实现从G港到Y城,但要从中找出G港到Y城距离最短的那一条路径,这就是单源最短路径问题。单源最短路径问题就是只有一个源头,从该源头出发,到达其他任意一个顶点可以走的最短路径。对于单源最短路径的题型,需要掌握BFS算法(可以求无权图的单源最短路径)和Dijkstra算法(可以求带权图和无权图的单源最短路径)。

ADCvbV的博客 1570

群晖Git Server权限配置全攻略:如何让普通用户(非admin)也能安全提交代码?

本文详细解析了群晖Git Server权限配置方案,特别针对普通用户(非admin)安全提交代码的需求。通过SSH服务配置、精细化用户权限管理及仓库创建自动化脚本,实现在DS218+等群晖NAS设备上的高效代码协作,同时确保系统安全。

weixin_42528780的博客 463

Matlab/simulink频率响应分析方法

Matlab/Simulink仿真系列问题一.电气模块与信号模块 一.电气模块与信号模块

virtuoso~晓晓 3万+

【算法】Dijkstra 算法:解决单源最短路径问题

Dijkstra 算法Dijkstra算法,中文名音译作迪杰斯特拉算法或戴克斯特拉算法,它是一个用来解决赋权图的单源最短路径问题的算法。之所以这个算法名这么不好读也不好记,是因为 Dij...

YeJuliaLi的博客 3716

AM驱动架构—优质Mini-LED显示技术解决方案

(VR)和增强现实(AR)设备:MiniLED背光驱动方案适用于虚拟现实和增强现实设备中的显示技术,通过高亮度和高对比度的显示效果,创造更逼真的虚拟体验此外,MiniLED背光还能够实现更快的响应速度,减少图像残影,使得用户的动作在虚拟环境中更加流畅自然。以其出色的性能和广泛的应用前景备受关注是实现MiniLED显示效果的重要环节。1)更高的亮度和对比度:尺寸更小,可以在同样面积的显示屏上配置更多的LED,并且通过独立控制每一个MiniLED,可以实现更高的亮度和更细致的对比度,使得显示画面更加鲜明清晰。

isweekDN的博客 2762

单源最短路径算法之Bellman-Ford算法

void Bellman_Ford( const int numOfVertex, /*节点数目*/ const int startVertex, /*源节点*/ int (map)[][6], /*有向图邻接矩阵*/ int

yinlili2010的专栏 1148

抖音短连接v.douyin.com/xxx 如何生成?

最近公司有个需求,在抖音里如何宣传自己的网站,并且不要有拦截域名的提示,截图如下。 通过ida反编译抖音的app后,将下载后的ipa文件用解压缩软件(如7zip等)解压,从解压后的目录Payload/Aweme.app/找到Aweme可执行文件,拖入ida进行反编译,ida可以检测objective-c语法。 然后进入主题,既然是聊天发消息,就尝试在ida里搜索"message",看看能否找到对...

kakuapi的博客 3万+

Vue3 - Vite运行打包时Uncaught ReferenceError: process is not defined(解决vue3+vite报错process is not defined)

vue3,vite,vue3+vite报错,process,UncaughtReferenceError:processisnotdefined,浏览器控制台报错processisnotdefined解决方法,vue3如何解决报错,vite报错怎么办,前端打包UncaughtReferenceError:processisnotdefined,npmrunbuild打包报错,vite打包时出现错误,vue3打包运行找不到process,热更新会报错UncaughtRefer

🏆 前端领域优质创作者 7737
上一篇: 初赛——备忘录
下一篇: 线段树详解
Wu_while
博客等级 码龄6年 50粉丝 53原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值