首页 > 其他分享 >【图论】单源最短路径 Dijkstra

【图论】单源最短路径 Dijkstra

时间:2024-12-06 22:21:14浏览次数:3  
标签:图论 ll 路径 单源 Dijkstra MAXN include dis

单源出发,最短路径,松弛。

Dijkstra 算法是所有最短路径算法中某种意义上最快的,只是代码略为难写。

松弛

Dijkstra 算法的精髓,就是两个字:松弛。包括所有的最短路径算法,都依靠的是这个词。
何为松弛?假设现有若干个点,点 \(v\) 到起点的最短路径很大,但是有另一个点 \(u\),它的路径值较小,而且它与 \(v\) 相连,则可以用 \(u\) 点的路径值加上边权值得出更优的 \(v\) 的路径值,即 \(dis_v=min(dis_v,dis_u+w)\)。

类似于 BFS 的代码结构

Dijkstra 类似一个 BFS,每次从一个顶点(已经被更新过的)更新所有它能更新的结点。而选出的这个结点就是已经更新过的结点中路径值的最小值。
不要忘记判断是否重复利用某个点。
我们可以采用优先队列(堆)来实现这个最小值的需求。

初始化

每个点的最初路径值都是 \(\infty\),只有起始结点的值为 \(0\),很好理解。

代码

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const ll MAXN = 200005;
const ll INF = 2147483647;
struct Edge{
	ll v, w;
};
vector<Edge> adj[MAXN];
struct Que{
	ll d, v;
	bool operator <(const Que &o)const{
		return v > o.v;
	}
};
ll n, m, dis[MAXN], vis[MAXN];
priority_queue<Que> q;
void Dijkstra(ll s){
	for(ll i = 1; i <= n; i ++){
		dis[i] = INF;
		vis[i] = 0;
	}
	dis[s] = 0;
	q.push({s, 0});
	while(!q.empty()){
		ll u = q.top().d;
		q.pop();
		if(vis[u])continue;
		vis[u] = 1;
		for(auto it : adj[u]){
			ll v = it.v, w = it.w;
			if(dis[u] + w < dis[v]){
				dis[v] = dis[u] + w;
				q.push({v, dis[v]});
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	ll s;
	cin >> n >> m >> s;
	for(ll i = 1; i <= m; i ++){
		int u, v, w;
		cin >> u >> v >> w;
		adj[u].push_back({v, w});
	}
	Dijkstra(s);
	for(ll i = 1; i <= n; i ++){
		cout << dis[i] << " ";
	}
	return 0;
}

标签:图论,ll,路径,单源,Dijkstra,MAXN,include,dis
From: https://www.cnblogs.com/Allen-yang2010/p/18591529

相关文章

  • 3、贪心算法python(活动选择问题、单源最短路径)
    一、活动选择问题给定一组活动,每个活动都有一个开始时间和结束时间,要求选择尽可能多的活动,并且这些活动之间不能有重叠。贪心策略的核心思想是每次选择结束时间最早的活动,这样可以为后续的活动留出更多的时间空间。活动选择问题的贪心算法步骤1、排序:首先按活动的结束时间对......
  • 图论2图的应用补充
    图论1基础内容-CSDN博客图的应用4.1拓扑排序拓扑排序针对有向无环图的顶点进行线性排列的算法,使得对于任何来自顶点A指向顶点B的边,A都在序列中出现在B之前。这样的排序存在于有向无环图中,而对于非有向无环图则不存在拓扑排序。拓扑排序也可以用来检测图中有无成环4......
  • Dijkstra算法的应用(算法思想)
    有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入说明:输入数据的第1行给出4个正整数......
  • 【知识】图论 朱刘算法梳理
    朱刘算法:树形图的定义:以某一个点为根的有向树,被称为树形图一个有向图,满足无环且每个点的入度为\(1\)(除了根节点),被称为树形图最小树形图:对于所有树形图中,找到一个总权值和最小的树形图,被称为最小树形图。最小树形图问题本质上其实就是有向图上的最小生成树问题。......
  • P3106 [USACO14OPEN] Dueling GPSs S —— 最短路 图论
    [USACO14OPEN]DuelingGPSsS题面翻译FarmerJohn最近在网上购买了一台新车,然而当他给这台新车挑选额外设备时他不小心快速地点击了“提交”按钮两次,因此这台新车配备了两台GPS导航系统!更糟糕的是,两台系统对FarmerJohn的出行路线经常做出相互冲突的决定。FarmerJohn......
  • BFS和Dijkstra结合
    Description数据结构与算法实验题SinsofaSolarEmpireP6★实验任务正如你所知道的s_sin是一个贪玩的不得了的小P孩QAQ,你也知道他最近很喜欢玩一个叫做太阳帝国的原罪的策略游戏去年他已经和疯狂的AI交战了整整一年。而现在,战斗的序幕又要拉开了。在某个星球上,该星球由......
  • 最短路径Dijkstra算法
    大家好!今天我想给大家讲一个非常有趣的算法,叫做Dijkstra算法。这个算法可以帮助我们在图中找到从一个点到另一个点的最短路径,就好像我们在玩一个寻找宝藏的游戏!故事开始想象你住在一个湖边,湖上有很多小岛,每个小岛之间都有桥连接,但是这些桥的长度不一样,有的很短,有的很长。现在......
  • 图论最短路算法笔记
    1图的基本操作1.1图的存储图存储有两种方法:邻接表和邻接矩阵。邻接表:g[N][N]={};...memset(g,0x3f,sizeofg);g[u][v]=w;邻接矩阵:inthead[N]={};memset(head,0x3f,sizeofhead);structedge{intpre,to,val;}EDGE[N];inlinevoidaddedge(......
  • 【代码随想录Day50】图论Part02
    岛屿数量深搜题目链接/文章讲解:代码随想录classSolution{//计算网格中岛屿的数量publicintnumIslands(char[][]grid){intsum=0;//初始化岛屿数量为0//遍历整个网格for(inti=0;i<grid.length;i++){......
  • 图论day64 :最短路径算法 | SPFA(Bellman_ford的队列优化版)、城市间货物运输 I、Ⅱ、Ⅲ
    图论day64:最短路径算法|SPFA(Bellman_ford的队列优化版)、94.城市间货物运输I(卡码网)【SPFA算法+邻接表优化】、95.城市间货物运输II(判断负权回路)、96.城市间货物运输III【已知有负权回路,该如何计算】、Bellman_ford算法思维导图汇总SPFA(Bellman_ford的队列优化版)94......