[模板] Dijkstra单源最短路径

[模板] Dijkstra单源最短路径十分基础的Dijkstra算法详见代码#definemaxn100000#definemaxm100000usingnamespacestd;constintINF=999999999;structHeapNode{ intd,u; booloperator<(constHeapNode&rhs)const { returnd>rh

大家好,又见面了,我是你们的朋友全栈君。

十分基础的Dijkstra算法

详见代码

#define maxn 100000
#define maxm 100000
using namespace std;
const int INF=999999999;
struct HeapNode
{
	int d,u;
	bool operator < (const HeapNode& rhs) const
	{
		return d>rhs.d;
	}
};
struct Edge
{
	int from,to,dist;
	Edge(int u,int v,int d):from(u),to(v),dist(d) {}
};
struct Dijkstra
{
	int n,m;
	vector<Edge> edges;
	vector<int> G[maxn];
	bool done[maxn];//是否用过(永久标号) 
	int d[maxn];//s到各个点的距离 (dist) 
	int p[maxn];//最短路上的一条边 (path) 
	
	void init(int n)
	{
		this->n=n;
		for(int i=0;i<n;i++)
		{
			G[i].clear(); 
		}
		edges.clear();
	} 
	
	void AddEdge(int from,int to,int dist)
	{
		edges.push_back(Edge(from,to,dist));
		m=edges.size();
		G[from].push_back(m-1);
	}
	
	void dijkstra(int s)
	{
		priority_queue<HeapNode> Q;
		for(int i=0;i<n;i++)
		{
			d[i]=INF;
		}
		d[s]=0;
		memset(done,0,sizeof(done));
		Q.push((HeapNode){0,s});
		while(!Q.empty())
		{
			HeapNode x=Q.top();
			Q.pop();
			int u=x.u;
			if(done[n])
			{
				continue;
			}
			done[u]=true;
			for(int i=0;i<G[u].size();i++)
			{
				Edge& e=edges[G[u][i]];
				if(d[e.to]>d[u]+e.dist)
				{
					d[e.to]=d[u]+e.dist;
					p[e.to]=G[u][i];
					Q.push((HeapNode){d[e.to],e.to});
				}
			}
		}
	}
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139191.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Window平台下通过cmd命令查看端口占用、查看进程、结束进程「建议收藏」

    Window平台下通过cmd命令查看端口占用、查看进程、结束进程「建议收藏」Window平台下通过cmd命令查看端口占用、查看进程、结束进程一、概述:在学习进程间通讯的时候,我们知道有一种通讯方式叫做socket。对于跨主机之间的进程通讯,这种方式更为常见,比如常见的基于B/S架构的web服务就是这种通讯方式的一个常见应用,客户端通过IP+PORT找到位于服务端上监听此端口的进程,从而与该进程进行数据通…

    2022年5月12日
    40
  • matlab读取txt数据文件「建议收藏」

    matlab读取txt数据文件「建议收藏」一、load()函数load函数适合读取纯数据文本例子,data_txt.txt内容如下:0  1.000000  2.000000  3.0000001  3.000000  4.000000  5.0000002  6.000000  7.000000  8.0000003  9.000000  10.00000  11.00000读取代码如下:%对于类似的txt文件,不含有字符,只有数字data=load(‘data_tx…

    2022年9月5日
    3
  • Ubuntu14.04安装Android SDK

    Ubuntu14.04安装Android SDK1前言做应用开发过程中,通常需要下载相应版本的的AndroidSDK,但是如果拥有了Android源码,是否还需要下载AndroidSDK呢(也即是说,源码中是否已经包含了AndroidSDK的所有内容)?本文以Android6.0.1为例进行对比分析。2下载AndroidSDK3源码prebuilts目录……

    2022年7月21日
    13
  • pycharm调试教程_程序调试时应当用

    pycharm调试教程_程序调试时应当用Python入门:使用PyCharm调试Python程序面向Python初学者PyCharm集成运行环境   在了解Python编程之前,我们需要先弄明白如何编写运行代码。所以非常有必要先讲解一下Python的集成开发环境,也就是IDE(IntegratedDevelopmentEnvironment)。PyCharm是一款优秀的开源Python语言集成开发工具。PyCharm…

    2022年8月26日
    4
  • ubuntu服务器硬件配置

    ubuntu服务器硬件配置1.系统cat/etc/issue2.内存free-h3.硬盘df-h4.CPUcat/proc/cpuinfocpu个数cat/proc/cpuinfo|grep”physicalid”|sort|uniq|wc-l

    2022年10月21日
    0
  • java io面试题_JavaIO流常见面试题

    java io面试题_JavaIO流常见面试题1.Java中有几种类型的流?字符流和字节流。字节流继承inputStream和OutputStream字符流继承自InputSteamReader和OutputStreamWriter总体结构图2.字节流和字符流哪个好?怎么选择?大多数情况下使用字节流会更好,因为大多数时候IO操作都是直接操作磁盘文件,所以这些流在传输时都是以字节的方式进行的(图片等都是按字节存储的)如果对于操作需要通过…

    2022年5月24日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号