Dijkstra

用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。Dijkstra的时间复杂度是O (|v|^2),它不能处理存在负边权的情况。

邻接矩阵存图

#include<iostream>
using namespace std;//最短路径——Djikstra算法
// 求单元最短路
// 时间复杂度:O(n^2)
//求最短路径:BFS、Floyd(基于dp)、Djikstra算法//以 邻接矩阵 存 带权无向图 为例#define INF 68888int g[105][105];
int dist[105];//记录最短路的大小
int path[105];//记录最短路的顺序
int flag[105];//flag[i]=1 i的最短路已确定  =0未确定
int n, m;
int s;//起点void Djikstra(int s) {//起点到起点flag[s] = 1;dist[s] = 0;path[s] = s;//其他点到起点int minn = INF;//最小的dist的值int t=0;//最小的dist的下标for (int i = 1; i < n; i++) {//循环n-1次minn = INF;for (int j = 0; j < n; j++) {if (flag[j] == 0 && dist[j] < minn) {minn = dist[j];t = j;}}//t点时dist值最小的点flag[t] = 1;//变为已确定最短路径的点//t去中转t的邻接点 修改distfor (int j = 0; j < n; j++) {if (flag[j] == 0 && dist[j] > (dist[t] + g[t][j])) {dist[j] = dist[t] + g[t][j];path[j] = t;}}}
}int main() {cin >> n >> m;//初始化for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i == j) {g[i][j] = 0;}else {g[i][j] = INF;}}}int x, y, w;for (int i = 1; i <= m; i++) {cin >> x >> y >> w;g[x][y] = g[y][x] = w;}cin >> s;//初始化for (int i = 0; i < n; i++) {dist[i] = g[s][i];if (g[s][i] == INF) {path[i] = -1;}else {path[i] = s;}}Djikstra(s);//输出验证for (int i = 0; i < n; i++) {cout << "s到" << i << "的最短路径长度是" << dist[i] <<":";//倒叙输出路径cout << i << " ";int j = i;while (path[j] != j) {cout << path[j] << " ";j = path[j];}cout << endl;}return 0;
}

链式前向星版本

#include<bits/stdc++.h>
using namespace std;
#define inf 1001 //链式前向星写Dijkstra 
int n,m,cnt; //n<100 0<权值<1000
int h[105];
struct Edge{int to,w,next;
}e[10005]; //100个点 最多100*(100-1)条边 
int dis[105],v[105]; void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u]; h[u]=cnt;cnt++;
}void dij(int x){for(int i=1;i<=n;++i) {dis[i]=inf;}dis[x]=0;int u; for(int j=1;j<=n;++j){int minn=inf,k=-1;for(int i=1;i<=n;++i){if(v[i]==0&&dis[i]<minn){minn=dis[i];k=i;}	} v[k]=1;for(int i=h[k];i!=-1;i=e[i].next){u=e[i].to;if(v[u]==0&&dis[u]>dis[k]+e[i].w){dis[u]=dis[k]+e[i].w; }}}
}int main(){memset(h,-1,sizeof h);cin>>n>>m;int x,y,w; for(int i=1;i<=m;++i){cin>>x>>y>>w;//有向图add(x,y,w); } cin>>x;dij(x);for(int i=1;i<=n;++i){cout<<dis[i]<<" ";}return 0;
} 

优化版本:堆 找最小的点 ------> 优先队列

#include<bits/stdc++.h>
using namespace std;
#define inf 1001 //链式前向星写Dijkstra 
int n,m,cnt; //n<100 0<权值<1000
int h[105];
struct Edge{int to,w,next;
}e[10005]; //100个点 最多100*(100-1)条边 
int dis[105],v[105]; 
typedef pair<int,int> PII; 
priority_queue<PII,vector<PII>,greater<PII>> q; void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u]; h[u]=cnt;cnt++;
}void dij(int x){//堆优化 for(int i=1;i<=n;++i) {dis[i]=inf;}dis[x]=0;PII now;now.first=dis[x];now.second=x;q.push(now);while(q.size()){now=q.top();q.pop();int minn=now.first;int k=now.second;if(v[k]==1) continue;//避免重复入队的点v[k]=1;for(int i=h[k];i!=-1;i=e[i].next){int u=e[i].to;if(dis[u]>minn+e[i].w){dis[u]=minn+e[i].w;now.first=dis[u];now.second=u;q.push(now); }}}
}int main(){memset(h,-1,sizeof h);cin>>n>>m;int x,y,w; for(int i=1;i<=m;++i){cin>>x>>y>>w;//有向图add(x,y,w); } cin>>x;dij(x);for(int i=1;i<=n;++i){cout<<dis[i]<<" ";}return 0;
} 

例题

1

P4779 【模板】单源最短路径(标准版) - 洛谷

#include<bits/stdc++.h>
using namespace std;
#define inf 1e9 
using ll=long long ;//链式前向星写Dijkstra 
int n,m,cnt; //n<100 0<权值<1000
int h[100005];
struct Edge{int to,w,next;
}e[200005]; //100个点 最多100*(100-1)条边 
ll dis[100005];
int v[100005]; 
typedef pair<int,int> PII; 
priority_queue<PII,vector<PII>,greater<PII>> q; void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u]; h[u]=cnt;cnt++;
}void dij(int x){//堆优化 for(int i=1;i<=n;++i) {dis[i]=inf;}dis[x]=0;PII now;now.first=dis[x];now.second=x;q.push(now);while(q.size()){now=q.top();q.pop();int minn=now.first;int k=now.second;if(v[k]==1) continue;v[k]=1;for(int i=h[k];i!=-1;i=e[i].next){int u=e[i].to;if(dis[u]>minn+e[i].w){dis[u]=minn+e[i].w;now.first=dis[u];now.second=u;q.push(now); }}}
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);memset(h,-1,sizeof h);int s;//scanf("%d %d %d",&n,&m,&s);cin>>n>>m>>s; int x,y,w; for(int i=1;i<=m;++i){//scanf("%d %d %d",&x,&y,&w);cin>>x>>y>>w;add(x,y,w); } dij(s);for(int i=1;i<=n;++i){//printf("%d ",dis[i]);cout<<dis[i]<<" ";}return 0;
} 

2

[P8802 蓝桥杯 2022 国 B] 出差 - 洛谷

#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
int n,m,cnt;
int h[1005],c[1005];
int flag[1005];//标记数组 
struct Edge{int to,w,next;
}e[20005];//无向图开两倍空间
int dis[1005]; 
typedef pair<int,int> PII;
priority_queue<PII,vector<PII>,greater<PII>> q;
void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u];h[u]=cnt;cnt++;
}void dij(int s){dis[s]=0;PII now,next;int u,v,w;now.first=dis[s];now.second=s;q.push(now);while(!q.empty()){now=q.top();q.pop();u=now.second;if(flag[u]==1) continue;flag[u]=1;for(int i=h[u];i!=-1;i=e[i].next){v=e[i].to;w=e[i].w;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;next.first=dis[v];next.second=v;q.push(next);}}} 
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m;memset(h,-1,sizeof h); memset(dis,0x3f,sizeof dis);//dis[i]=0x3f3f3f3f按字节赋值 for(int i=1;i<=n;++i){cin>>c[i];}int u,v,w;for(int i=1;i<=m;++i){cin>>u>>v>>w;add(u,v,w+c[v]);//u---->v   点权加入边权里 add(v,u,w+c[u]);//v---->u}dij(1);cout<<dis[n]-c[n]<<endl; //最后减去终点点权 return 0;
} 

3

P1462 通往奥格瑞玛的道路 - 洛谷

#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
int n,m,b,cnt=0;
int h[10005],f[10005];
int flag[10005];//标记数组 
struct Edge{int to,w,next;
}e[100005];//无向图开两倍空间
int dis[10005]; 
typedef pair<int,int> PII;
priority_queue<PII,vector<PII>,greater<PII>> q;
void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u];h[u]=cnt;cnt++;
}bool dij(int s,int maxx){if(maxx<f[s]) return false; memset(dis,0x3f,sizeof dis);memset(flag,0,sizeof flag);PII now,next;int u,v,w;dis[s]=0;now.first=dis[s];now.second=s;q.push(now);while(!q.empty()){now=q.top();q.pop();u=now.second;if(flag[u]==1) continue;flag[u]=1;for(int i=h[u];i!=-1;i=e[i].next){v=e[i].to;w=e[i].w;if(f[v]<=maxx&&dis[v]>dis[u]+w){dis[v]=dis[u]+w;next.first=dis[v];next.second=v;q.push(next);}}} return dis[n]<=b;
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m>>b;memset(h,-1,sizeof h); int l=0x3f3f3f3f,r=-0x3f3f3f3f; for(int i=1;i<=n;++i){cin>>f[i];r=max(r,f[i]);l=min(l,f[i]);}int u,v,w;for(int i=1;i<=m;++i){cin>>u>>v>>w;if(u==v) continue;//有自环 add(u,v,w);add(v,u,w);}if(dij(1,0x3f3f3f3f)==0){cout<<"AFK"<<endl;return 0;}//二分求答案int mid=0,ans=0;while(l<=r){mid=(l+r)/2;if(dij(1,mid)){ans=mid;r=mid-1;}else{l=mid+1;}} cout<<ans<<endl;return 0;
} 

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

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

相关文章

影刀 RPA:批量修改 Word 文档格式,高效便捷省时省力

在日常办公和文档处理中&#xff0c;Word 文档格式的统一和规范是许多企业和个人用户的重要需求。无论是撰写报告、制作提案&#xff0c;还是整理资料&#xff0c;都需要确保文档格式的一致性。然而&#xff0c;手动修改多个 Word 文档的格式不仅耗时费力&#xff0c;还容易因疏…

GitLab 社区版 10.8.4 安装、汉化与使用教程

一、GitLab 安装 GitLab 提供了集成所需软件的 RPM 包&#xff0c;简化了安装流程。我们选择安装社区版&#xff08;CE&#xff09;10.8.4&#xff0c;可通过官方网站或国内镜像源&#xff08;如清华镜像&#xff09;获取安装包。 1. 准备工作 首先创建工具目录并进入&#…

[硬件电路-64]:模拟器件 -二极管在稳压电路中的应用

二极管在稳压电路中的应用主要基于其单向导电性和特定类型二极管&#xff08;如稳压二极管&#xff09;的电压稳定特性。以下是详细解释&#xff1a;一、普通二极管的稳压作用&#xff08;有限场景&#xff09;正向导通压降的利用&#xff1a;原理&#xff1a;普通二极管在正向…

【Linux】重生之从零开始学习运维之Nginx

安装apt/yum安装apt imstall nginx yum install nginxRocky源码编译安装基础编译环境yum install gcc make gcc-c glibc glibc-devel pcre pcre-devel openssl openssldevel systemd-devel zlib-devel yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-deve…

主流 MQ 的关键性能指标

常用消息队列&#xff08;MQ&#xff09;的“数量级”通常围绕吞吐量&#xff08;TPS&#xff0c;每秒处理消息数&#xff09;、消息堆积能力、延迟三个核心指标展开&#xff0c;不同MQ因设计目标&#xff08;高吞吐、低延迟、高可靠等&#xff09;不同&#xff0c;数量级差异显…

[NIPST AI]对抗性机器学习攻击和缓解的分类和术语

原文link&#xff1a;https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2025.pdf Introduction 人工智能&#xff08;AI&#xff09;系统在过去几年中持续全球扩展。这些系统正在被众多国家开发并广泛部署于各自的经济体系中&#xff0c;人们在生活的许多领域都获得了更多使…

[深度学习] 大模型学习3上-模型训练与微调

在文章大语言模型基础知识里&#xff0c;模型训练与微调作为大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;应用构建的主要方式被简要提及&#xff0c;本系列文章将从技术原理、实施流程及应用场景等维度展开深度解析。相关知识的进一步参考见&#x…

Claude Code 启动提示 Note: Claude Code might not be available in your country. 解决

如下图所示 主播参考了在别的地方看来的解决方案&#xff08;并非主播不想标注来源&#xff0c;主要是忘记是哪里看来的了&#xff0c;下班就忘记了&#xff0c;懒得找了&#x1f62d;&#xff0c;如果后续找到会补上的&#xff09;。 好了&#xff0c;开始正文&#xff0c;开始…

Unity VR多人手术系统恢复3:Agora语音通讯系统问题解决全记录

&#x1f3af; 前言 这是一个Unity多人VR手术模拟项目&#xff0c;已经搁置了近两年时间。最近重新启动了这个项目&#xff0c;然而在恢复过程中却遇到了些的技术障碍。 项目重启遇到的挑战 当我们重新部署和测试系统时&#xff0c;发现原本运行良好的Agora语音通讯功能完全…

sqli-labs靶场通关笔记:第46-53关 order by注入

目录 第46关 order by注入 第47关 闭合的order by注入 第48关 无报错回显的数字型order by注入 第49关 无报错回显的闭合型order by注入 第50关 基于order by的堆叠注入 第51关 闭合的报错注入或堆叠注入 第52关 数字型盲注或堆叠注入 第53关 闭合的盲注或堆叠注入 第…

cdh6.3.2的hive使用apache paimon格式只能创建不能写报错的问题

前言根据官网paimon安装教程&#xff0c;看上去简单&#xff0c;实则报错阻碍使用的信心。 解决方法原带的jars下的zstd开头的包旧了&#xff0c;重新下载zstd较新的包单独放到每个节点的hive/lib下;然后将hdfs yarn用户下的mr-framework.tar.gz中的zstdjar包替换成新的版本。重…

【Vue进阶学习笔记】实现图片懒加载

创建Vue项目 首先确保你已安装Vue CLI&#xff0c;然后创建一个新的Vue 3项目&#xff1a; npm init vuelatest安装依赖 安装vueuse/core库&#xff0c;它提供了useIntersectionObserver组合式API&#xff1a; cnpm install cnpm install vueuse/core创建指令文件夹和文件 在sr…

深入理解 synchronized

深入理解 synchronized 引言&#xff1a;synchronized的核心地位 在Java并发编程中&#xff0c;synchronized关键字是实现线程安全的基石。自JDK 1.0引入以来&#xff0c;它经历了从"重量级锁"到"自适应锁"的进化&#xff0c;如今已成为兼顾安全性与性能的…

C语言字符串相关函数

C语言笔记内容提要数组字符串基本操作字符串相关函数综合案例&#xff1a;学生成绩管理系统数组字符串基本操作在用格式化说明符%s进行输入输出时&#xff0c;其输入输出项均为数组名。但在输入时&#xff0c;相邻两个字符串之间要用空格分隔&#xff0c;系统将自动在字符串后加…

从零开始:用Python库轻松搭建智能AI代理

为什么要关注AI代理&#xff1f; “Agentic AI”&#xff08;智能代理&#xff09;正在悄然改变我们的工作方式。想象一下&#xff0c;一个AI助手不仅能帮你查航班、订机票&#xff0c;还能自动安排行程、发邮件、生成日报——就像一个效率极高的“虚拟助理”团队。 对于测试工…

如何防止GitHub上的敏感信息被泄漏?

如大家所了解的&#xff0c;随着GitHub的用户越来越多&#xff0c;GitHub上的敏感信息被泄漏的问题也越来越严重。那么如何做&#xff0c;才能防止此类事情发生呢&#xff1f;这值得我们探讨。移除并删除敏感信息当我们发现了历史 commit 中包含敏感信息后&#xff0c;第一步便…

船舶机械零件的深孔工艺及检测方法 —— 激光频率梳 3D 轮廓检测

引言船舶机械零件中的深孔结构&#xff08;深径比&#xff1e;15:1&#xff09;直接影响动力系统可靠性&#xff0c;如柴油机缸体深孔、推进轴系润滑油孔等。此类深孔具有孔径大&#xff08;φ10 - 50mm&#xff09;、深度深&#xff08;500 - 2000mm&#xff09;、表面质量要求…

论文Review Lidar 3DGS Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping

基本信息 题目&#xff1a;Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping 来源&#xff1a;ICCV 2025 学校&#xff1a;Sapienza University of Rome 是否开源&#xff1a;https://github.com/rvp-group/Splat-LOAM 摘要&#xff1a;纯激光3DGS&#xff01;…

MYSQL:数据库约束

文章目录MYSQL&#xff1a;数据库约束&#xff1a;为你的数据上把“安全锁”1. 约束的类型概览2. NOT NULL 非空约束3. DEFAULT 默认值约束4. UNIQUE 唯一约束5. PRIMARY KEY 主键约束5.1 自增主键 AUTO_INCREMENT5.3 复合主键6. FOREIGN KEY 外键约束7. CHECK 约束总结MYSQL&a…

网络数据编码技术及其应用场景的全面解析

网络数据编码技术全景图​编码类型​​编码原理​​适用层​​典型应用场景​​优势​​缺陷​​曼彻斯特编码​电平跳变代表数据位&#xff08;高→低1&#xff0c;低→高0&#xff09;物理层10/100M以太网、RFID标签自同步时钟带宽利用率仅50%​4B/5B编码​4比特映射为5比特物…