[模板] 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro550反序列化漏洞分析首发自安全客:Java安全之Shiro550反序列化漏洞分析0x00前言在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是

    2021年12月12日
  • phpstorm激活码永久[最新免费获取]2022.02.11「建议收藏」

    (phpstorm激活码永久)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html4K…

    2022年4月1日
  • chrome添加扩展程序无效_vue兼容性问题

    chrome添加扩展程序无效_vue兼容性问题chrome扩展程序中以编程方式插入内容脚本不生效的问题

    2022年4月20日
  • 在图像的傅里叶变换中,什么是基本图像_傅立叶变换

    在图像的傅里叶变换中,什么是基本图像_傅立叶变换从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。 傅立叶变换属于调和分析的内容。”分析”二字,可以解释为深入的研究。从字面上来看,”分析”二字,实际就是”条分缕析”而已。它通过对函数的”条分缕析”来达到对复杂函数的深入理解和研究。从哲学上看

    2022年8月30日
  • 推荐三十款最好的免费项目管理软件

    推荐三十款最好的免费项目管理软件1.TeamLab  TeamLab 是一个免费开源的商业协作和项目管理的平台。TeamLab 主要功能包括:项目管理、里程碑管理、任务、报表、事件、博客、论坛、书签、Wiki、即时消息等等。2.XPlanner+   XPlanner是专门为XP(极限编程)团队设计的项目管理工具3.NavalPlan   NavalPlan是一

    2022年5月13日
  • java 查看线程死锁_java 查看线程死锁

    java 查看线程死锁_java 查看线程死锁那我们怎么确定一定是死锁呢?有两种方法。1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。1)连接到需要查看的进程。2)打开线程选项卡,然后点击左下角的“检测死锁”3)jconsole就会给我们检测出该线程中造成死锁的线程,点击选中即可查看详情:从上图中我们可以看出:①在线程Thread-1中,从状态可以看出,它想申请Paper这个资源,但是这个资…

    2022年7月13日

发表回复

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

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