Dijkstra算法——计算一个点到其他所有点的最短路径的算法

迪杰斯特拉算法百度百科定义:传送门

gh大佬博客:传送门

迪杰斯特拉算法用来计算一个点到其他所有点的最短路径,是一种时间复杂度相对比较优秀的算法 O(n2)(相对于Floyd算法来说)

是一种单源最短路径算法,但是它并不能处理负边权的情况

Dijkstra的算法思想:①将一开始所有的非源点到源的距离设置成无限大(你认为的无限大实际上是0x3f(int)或者0x7fffffff(long long)),然后源到源距离设置成0(不就是0吗),然后每次找到一个距离源最短的点u,将其变成白点,枚举所有的蓝点,如果源到白点存在中转站——一个蓝点使得源->蓝点和蓝点->白点的距离和更短,就更新。②每找到一个白点,就尝试更新其他蓝点,直到更新完毕。

代码及注释:

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<time.h>
#include<queue>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pr;
const double pi=acos(-1);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Rep(i,u) for(int i=head[u];i;i=Next[i])
#define clr(a) memset(a,0,sizeof a)
#define pb push_back
#define mp make_pair
#define fi first
#define sc second
ld eps=1e-9;
ll pp=1000000007;
ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
ll read(){ll ans=0;char last=' ',ch=getchar();while(ch<'0' || ch>'9')last=ch,ch=getchar();while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();if(last=='-')ans=-ans;return ans;
}//快读
//headconst int maxn=5001;
int g[maxn][maxn];//g数组用来存储图; 
int n,m,s;//分别表示点的个数、有向边的个数、出发点的编号;
bool vis[maxn];//表示是否已经到达过;
int d[maxn];//d[i]表示从询问点到点i的最短路径;
const int inf=2147483647;int main ()
{n=read(),m=read(),s=read();rep(i,1,n){d[i]=inf;rep(j,1,n)g[i][j]=inf;g[i][i]=0;//自己到自己的最短路径当然是0 }//初始化数组; 
    rep(i,1,m){int u=read(),v=read(),w=read();//u,v,i分别表示第i条有向边的出发点、目标点和长度;g[u][v]=w;//读入; 
    }vis[s]=1;//将起点标记成已经到达;
    rep(i,1,n)d[i]=g[s][i];//将最短路径初始化;//如果两点之间有路线就初始化为该距离,如果没有就还是inf;while(1){int stt_node=0,stt_dis=inf;//stt=shortest 初始化两个变量 // stt_node表示最短路径的终点,stt_dis表示最短路径的长度 
        rep(i,1,n){ if(vis[i]==0&&d[i]<stt_dis)//如果该点还没有到达,并且他的距离小于最短距离 
            {stt_node=i,stt_dis=d[i];//更新变量 
            }}if(stt_node==0) break;//如果已经没有可以更新的最短路径了,就说明已经结束了
        vis[stt_node]=1;//将该点标记成已经到达 
        rep(i,1,n){if(vis[i]||g[stt_node][i]==inf)continue;//如果并没有到达或者是两点之间没有路径,就进入下一层循环 
            d[i]=min(d[i],stt_dis+g[stt_node][i]);//更新最短路径 
        }}rep(i,1,n)printf("%d ",d[i]);return 0;
}

我们考虑一下对它的优化。因为如果我们每一次都要扫一遍判断出边,我们还不如直接存出边:

邻接表!(链式前向星)

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<time.h>
#include<queue>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pr;
const double pi=acos(-1);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Rep(i,u) for(int i=head[u];i;i=Next[i])
#define clr(a) memset(a,0,sizeof a)
#define pb push_back
#define mp make_pair
#define fi first
#define sc second
ld eps=1e-9;
ll pp=1000000007;
ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
ll read(){ll ans=0;char last=' ',ch=getchar();while(ch<'0' || ch>'9')last=ch,ch=getchar();while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();if(last=='-')ans=-ans;return ans;
}//快读
//headconst ll INF = 2147483647;
struct edge
{ll to, dis_, next;
} Edge[9999999];
struct node
{ll to, dis;inline friend bool operator<(const node &a, const node &b){return a.dis < b.dis;}
};
ll head[9999999], dis[9999999];
bool vst[9999999];
ll nodenum, edgenum, origin_node, cnt = 1, t;
priority_queue<node> q;inline void add_edge(ll from, ll to, ll value)
{Edge[cnt].to = to;Edge[cnt].dis_ = value;Edge[cnt].next = head[from];head[from] = cnt++;
}inline void dijkstra()
{for (register int i = 1; i < origin_node; i++){dis[i] = INF;}//dis[origin_node]=0;for (register int i = origin_node + 1; i <= nodenum; i++){dis[i] = INF;}q.push((node){origin_node, 0});while (!q.empty()){int x = q.top().to;q.pop();if (vst[x])continue;vst[x] = 1;for (register int i = head[x]; i; i = Edge[i].next){dis[Edge[i].to] = min(dis[Edge[i].to], dis[x] + Edge[i].dis_);q.push((node){Edge[i].to, dis[Edge[i].to]});}}
}int main()
{nodenum = read(), edgenum = read(), origin_node = read() ;//t=read();for (register int i = 1; i <= edgenum; i++){register int f, t, v;f = read(), t = read(), v = read();add_edge(f, t, v);}dijkstra();rep(i,1,nodenum){printf("%lld ",dis[i]);}return 0;
}

 

 

 

 

转载于:https://www.cnblogs.com/lcezych/p/10739866.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈java中extends与implements的区别

Extends可以理解为全盘继承了父类的功能。implements可以理解为为这个类附加一些额外的功能&#xff1b;interface定义一些方法,并没有实现,需要implements来实现才可用。extend可以继承一个接口,但仍是一个接口,也需要implements之后才可用。对于class而言&#xff0c;Extends…

注意力机制 神经网络_图注意力网络(GAT)

引言作者借鉴图神经网络中的注意力机制&#xff0c;提出了图注意力神经网络架构&#xff0c;创新点主要包含如下几个&#xff1a;①采用masked self-attention层&#xff0c;②隐式的对邻居节点采用不同权重③介绍了多头注意力机制。 在作者的Introduction中&#xff0c;该论文…

java版问题

1.必填项在初次保存后应该已经有值了&#xff0c;怎么会加载数据又是空的的&#xff1f; 2.客户类型 企业性质&#xff1f; 一般机构、上市公司.... 3.文档管理-->上传文档&#xff0c;如果左侧选中文档节点时&#xff0c;上传文档时是否默认选中文档节点。 转载于:https:/…

html5标签属性大全_HTML5中video标签如何使用

HTML5中的video标签用于播放视频文件的&#xff0c;在video标签中我们可以设置窗口的宽高&#xff0c;视频的自动播放&#xff0c;循环播放以及视频的封面图片等等HTML5是下一代HTML&#xff0c;新增了许多新的标签&#xff0c;这些标签实现了许多新的功能。并且还减少了对外部…

Java中@Override的作用

Override是伪代码,表示重写(当然不写也可以)&#xff0c;不过写上有如下好处: 1、可以当注释用,方便阅读&#xff1b; 2、编译器可以给你验证Override下面的方法名是否是你父类中所有的&#xff0c;如果没有则报错。例如&#xff0c;你如果没写Override&#xff0c;而你下面的…

java程序中用户名和密码_在Java应用程序中使用密码术

java程序中用户名和密码这篇文章描述了如何使用Java密码体系结构 &#xff08;JCA&#xff09;&#xff0c;该体系结构使您可以在应用程序中使用密码服务。 Java密码体系结构服务 JCA提供了许多加密服务&#xff0c;例如消息摘要和签名 。 这些服务可通过特定于服务的API来访…

C++ setw和setfill

在C中&#xff0c;setw(int n)用来控制输出间隔。 例如: cout<<s<<setw(8)<<a<<endl; 则在屏幕显示 s a //s与a之间有7个空格&#xff0c;setw()只对其后面紧跟的输出产生作用&#xff0c;如上例中&#xff0c;表示a共占8个位置&#xff0c;不…

Linux快捷键

附上一些其他较长使用的快捷键&#xff1a; ctrl w —往回删除一个单词&#xff0c;光标放在最末尾 ctrl k —往前删除到末尾&#xff0c;光标放在最前面&#xff08;可以使用ctrla&#xff09; ctrl u 删除光标以前的字符 ctrl k 删除光标以后的字符 ctrl a 移动光标至的…

会python基础可以找到工作吗_我大学退学,现在 28 岁,如果零基础开始学 python,可以找到工作吗?...

作为一名IT行业从业者&#xff0c;同时也是一名教育工作者&#xff0c;我来回答一下这个问题。 首先&#xff0c;对于28岁且没有获得大学文凭的初学者来说&#xff0c;要想通过学习Python来找到工作还是具有一定难度的&#xff0c;一方面原因是目前开发岗位通常都有一定的学历要…

测试Java EE 8规范

Java EE 8平台肯定在过去的几个月中一直在发展。 规范已经发布了早期的草案评审&#xff0c;里程碑甚至最终版本。 实际上&#xff0c;随着JSF 2.3的发布&#xff0c;JSR-372才刚刚进入最终版本。 有关更多信息&#xff0c;请参见 Arjan的帖子 。 它有幸成为JSR-372专家组的成…

C++ this

对象a的内存地址和this指针的一模一样(都是0017F7E8)&#xff1b;而当运行到对象b的时候&#xff0c;它的内存地址又和它所对应的this指针指向的内存地址一模一样了(都是0017F7DC)。这就说明了this指针变量记录的是当前对象的内存地址&#xff0c;即this指针指向当前的对象

修改weblogic端口的方法

修改weblogic端口的方法 修改weblogic的端口常用的有两种方法 方法一.登录weblogic的console。如&#xff1a;http://localhost:7001/console/  1).在环境--服务器节点中点击你要修改的服务器的端口的名称(如下图&#xff1a;AdminServer(管理)) 2).上述步骤打开的页面如下图…

什么是JAX-RS注释? (第2部分)

JAX-RS注释概述&#xff08;第2部分&#xff09; 这是一个由三部分组成的系列&#xff0c;介绍了用于实现REST端点的注释。 在JAX-RS注释的第一部分中&#xff0c;您了解了&#xff1a; ApplicationPath批注 Path注释 GET HTTP方法注释 POST HTTP方法注释 PUT HTTP方法…

eclipse 快捷键组合

更多快捷键组合可在Eclipse按下ctrlshiftL查看。 让我们按照使用频率来看看我最爱用的一些热键组合。&#xff08;注&#xff1a;以下内容在Eclipse3.02及一上版本通过测试&#xff09; 1. Control-Shift-T: 打开类型&#xff08;Open type&#xff09;。如果你不是有意磨洋工…

java实体类转map_十五道经典面试题-JAVA基础篇

十五道JAVA基础面试题送给有需要的童鞋&#xff0c;但是不得不多提醒一句&#xff0c;打铁还需自身硬&#xff0c;计算机软件这个行业&#xff0c;技术和学历才是王道。好了&#xff0c;废话不多说&#xff0c;上菜&#xff1a;一&#xff1a;面向对象的特征有哪些方面 1. 抽象…

C++ 指针函数和函数指针

1、指针函数 &#xff08;1&#xff09;基本概念 指针函数&#xff1a;顾名思义就是带有指针的函数&#xff0c;即其本质是一个函数&#xff0c;只不过这种函数返回的是一个对应类型的地址。 &#xff08;2&#xff09;定义式 type *func(type , type) 如&#xff1a;int…

B树

B树是为磁盘或其他直接存储的辅存设备而设计的一种平衡搜索树。 B树类似于红黑树&#xff0c;但在降低磁盘I/O操作数方面要更好一些。许多数据库系统使用B树或者B树的变种来存储信息。 B树与红黑树的不同之处在于B树的结点可以有很多孩子&#xff0c;从数个到数千个。也就是说&…

如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

如何使用recaptchaCAPTCHA是一个程序&#xff0c;可以生成人类可以通过但计算机程序“ 不能 ”通过的测试并对其进行评分。 所采取的策略之一是向用户显示具有扭曲文本的图像&#xff0c;并且用户应在输入区域中书写文本。 如果显示的文字与用户输入的文字相同&#xff0c;则我…

micropython esp8266教程_(一)ESP8266/nodemcu如何使用MicroPython进行开发

简介 大家都知道ESP8266&#xff08;nodemcu&#xff09;可以使用arduino的语法&#xff08;C&#xff09;进行开发&#xff0c;也有些小伙伴可能也知道可以使用lua语言进行开发的。但是现在我们也可以使用python来开发esp8266&#xff08;nodemcu&#xff09;了。那么这篇教程…

PostGIS之路——几何对象编辑(二)

1、ST_Reverse返回几何对象顶点顺序相反的几何对象。geometry ST_Reverse(geometry g1);示例SQL&#xff1a;SELECT ST_AsText(the_geom) as line, ST_AsText(ST_Reverse(the_geom)) As reverselineFROM(SELECT ST_MakeLine(ST_MakePoint(1,2),ST_MakePoint(1,10)) As the_geom…