首页 > 编程语言 >Dijkstra算法

Dijkstra算法

时间:2024-04-18 14:44:06浏览次数:26  
标签:cnt int eg nd 算法 Dijkstra 集合 dis

单源最短路算法,不能处理负环,朴素版时间复杂度\(O(n^2)\),堆优化版时间复杂度\(O(nlogn)\)。
Dijkstra算法的流程是:
将所有的节点分为A、B的两个集合,一开始A集合中只有起点,其他的节点在B集合。定义B中的节点与A的距离:若邻接A中的结点,则距离为边权;反之距离无穷大。
1.找到与A距离最小的B集合中的节点,称之为d。(朴素版需要遍历B集合,堆优化版直接得到)
2.将d加入集合A,并在集合B中删去d。
3.更新B到A的距离。(只需更新d在B中的邻接节点)
4.若B集合为空,则退出;反之回到步骤1。
模板题目练习:洛谷:P4779

代码示例:(用优先队列实现的堆优化版)

#include <bits/stdc++.h>

const int maxN = 100005, maxM = 500005;

struct edge
{
	int to, dis, next;
};
edge eg[maxM];

int head[maxN], dis[maxN], cnt;
bool vis[maxN];
int n, m, s;

inline void add_edge(int u, int v, int d)
{
	cnt++;
	eg[cnt].dis = d;
	eg[cnt].to = v;
	eg[cnt].next = head[u];
	head[u] = cnt;
}

struct node
{
	int dis;
	int pos;
	bool operator<(const node& x) const
	{
		return x.dis < dis;
	}
};

std::priority_queue<node> nd;

void dijkstra()
{
	dis[s] = 0;
	nd.push(node({ 0, s }));
	while (!nd.empty())
	{
		node tmp = nd.top();
		nd.pop();
		int x = tmp.pos, d = tmp.dis;
		if (vis[x])
			continue;
		vis[x] = true;
		for (int i = head[x]; i; i = eg[i].next)
		{
			int y = eg[i].to;
			if (dis[y] > dis[x] + eg[i].dis)
			{
				dis[y] = dis[x] + eg[i].dis;
				if (!vis[y])
				{
					nd.push(node({ dis[y], y }));
				}
			}
		}
	}
}

标签:cnt,int,eg,nd,算法,Dijkstra,集合,dis
From: https://www.cnblogs.com/Cnoized/p/18143484

相关文章

  • 基于深度学习的停车场车辆检测算法matlab仿真
    1.算法运行效果图预览   上图测试结果如下图所示:   2.算法运行软件版本matlab2022a 3.算法理论概述     随着城市交通管理和智慧停车系统的快速发展,停车场车辆检测已成为实现高效车位管理、智能计费的关键技术之一。深度学习,尤其是基于卷积神经网络(CN......
  • 数据结构与算法
    1数据结构1.1动态数组①数组特点存储特点:连续存储优点:查找块,访问元素快缺点:插入、删除元素效率低②实现思路1.初始化:malloc()动态分配内存区域2.扩展长度:realloc()重新调整内存区域大小3.插入元素:插入位置,后面所有元素后移4.删除元素:删除位置,后面所有元......
  • 先进先出算法
    一、意义目的解决多个多个呼叫一个应答问题。如何排队,如何出队。常用于缓存多个请求,保持队列,先进先出。好处是有顺序,但是可以结合实际,比如位置比较近要先出,可以将“先进先出”作为排队出队子算法,再去排序,达到效率最高。二、原理:使用数组改变下标方式存入,出栈把后面变量一个......
  • 复杂网络社区发现算法聚类分析全国电梯故障数据和可视化:诊断电梯“安全之殇”|附代码
    参考原文:http://tecdat.cn/?p=2186最近我们被客户要求撰写关于复杂网络社区发现算法的研究报告,包括一些图形和统计输出。物业工程肩负着维持项目各类设施设备的正常运作,保障全体业主的正常生活,令物业保值升值,是项目的心脏部门。拓端数据(tecdat)研究人员根据全国电梯故障上报汇总......
  • 29天【代码随想录算法训练营34期】第七章 回溯算法part05 (491.递增子序列 * 46.全排
    491.递增子序列如果在最前面加一个uset=set(),这个就是给这一层一个usedset,很好用,不错classSolution:deffindSubsequences(self,nums:List[int])->List[List[int]]:result=[]self.backtracking(nums,[],result,0)returnresult......
  • 算法
    冒泡:选择:插入:希尔:归并:快速:堆:计数:桶:基数:......
  • js 搜索查找算法
    线性查找线性查找是最简单的一种查找算法,它的基本思想是从头到尾遍历待查找的数据集,找到对应的元素,时间复杂度为O(n)。代码实现:functionlinearSearch(arr,target){for(leti=0;i<arr.length;i++){if(arr[i]===target){returni;......
  • KMP算法 Java实现
    Problem:28.找出字符串中第一个匹配项的下标目录解题方法思路构建next数组回溯查找复杂度Code解题方法构建next串回溯查找next串,最后下标思路通过最大前缀后缀能找到下一次未查找到后要回溯的位置构建next数组无论如何第一个数的下一次回溯位置肯定是0,因此next[......
  • Python 数据结构和算法实用指南(三)
    原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d译者:飞龙协议:CCBY-NC-SA4.0第七章:哈希和符号表我们之前已经看过数组和列表,其中项目按顺序存储并通过索引号访问。索引号对计算机来说很有效。它们是整数,因此快速且易于操作。但是,它们并不总是对我们很有效......
  • Python 数据结构和算法实用指南(一)
    原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d译者:飞龙协议:CCBY-NC-SA4.0前言数据结构和算法是信息技术和计算机科学工程学习中最重要的核心学科之一。本书旨在提供数据结构和算法的深入知识,以及编程实现经验。它专为初学者和中级水平的研究Python编......