P8802 [蓝桥杯 2022 国 B] 出差

devtools/2024/10/23 22:32:02/

P8802 [蓝桥杯 2022 国 B] 出差

分析

很明显:单源最短路径 + 没有负权边 = dijkstra

1.存图

2.准备两个数组

dis[]:更新源点到各个点的距离

vis[]:标记是否访问

3.从源点开始,更新源点到与其邻接的点的距离,每次选出dis[]min且未访问的点进行重复上述步骤

代码

两种实现方法:

1.链式前向星存图 + prioroty_queue

注意:优先队列默认大根堆,故要重载 < ;且优先队列按优先级排序,对于 < 而言,a < b为true的意思是,右边的优先级大于左边,故应为return a > b;

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;typedef long long ll;
const int N = 1010,M = 10010;
struct Node{int u,dis;//重载 <(优先队列默认大根堆)bool operator < (const Node &x)const{return dis > x.dis;}
};
//链式前向星
struct edges{int to;int ne;int w;
}e[M*2];
int head[N],cnt = 1,n,m,c[N];
ll dis[N];
bool vis[N];
priority_queue<Node> q;//初始化
void init()
{memset(head,-1,sizeof head);memset(dis,0x3f,sizeof dis);
}
//加边
void add(int u,int v,int w)
{e[cnt].to = v;e[cnt].ne = head[u];e[cnt].w = w;head[u] = cnt ++;
}
//dijkstra模板
void dijkstra(int x)
{dis[x] = 0;q.push((Node){x,0});while(!q.empty()){Node t = q.top();q.pop();int u = t.u;if(vis[u]) continue;vis[u] = 1;for(int i = head[u];i != -1;i = e[i].ne)  //遍历邻接点{int v = e[i].to;int w = e[i].w;if(dis[v] > dis[u] + w)  //更新dis[]{dis[v] = dis[u] + w;if(!vis[v]) q.push((Node){v,dis[v]});  //未被访问,压入队列}}}
}int main()
{init();scanf("%d %d",&n,&m);for(int i = 1;i <= n;i ++) scanf("%d",&c[i]);for(int i = 1;i <= m;i ++){int u,v,w;scanf("%d %d %d",&u,&v,&w);add(u,v,w + c[v]);  //把隔离时间当边权值add(v,u,w + c[u]);}dijkstra(1);printf("%lld",dis[n] - c[n]);  //减去最后一个城市的隔离时间return 0;
}

2.邻接矩阵存图 + 一重循环(高举y总大旗!超简洁!)

#include<iostream>
#include<cstring>
using namespace std;typedef long long ll;
const int N = 1010;
int g[N][N],n,m,c[N];
ll dis[N];
bool vis[N];void dijkstra()
{memset(dis,0x3f,sizeof dis);dis[1] = 0;//重复分析中的第三步n-1次即可for(int i = 1;i < n;i ++){//找到dis[]中的min且未被访问int t = 0;  //初始化dis[]为0x3f,t = 0时,dis[t] = maxfor(int j = 1;j <= n;j ++){if(!vis[j] && dis[t] > dis[j]) t = j;}//找到t,用t更新dis[]for(int j = 1;j <= n;j ++){if(dis[j] > dis[t] + g[t][j])dis[j] = dis[t] + g[t][j];}vis[t] = true;  //记得标记一下已访问}return ;
}int main()
{memset(g,0x3f,sizeof g);  //初始化g[][]scanf("%d%d",&n,&m);for(int i = 1;i <= n;i ++) scanf("%d",&c[i]);for(int i = 1;i <= m;i ++){int x,y,z;scanf("%d%d%d",&x,&y,&z);g[x][y] = z + c[y];g[y][x] = z + c[x];  //存双向边 + c[x]}dijkstra();printf("%lld",dis[n] - c[n]);return 0;
}


http://www.ppmy.cn/devtools/39369.html

相关文章

eslint关闭的方法总结

package.json关闭eslint 直接注释package.json文件中eslint的配置 "eslintConfig": {"root": true,此项是用来告诉eslint找当前配置文件不能往父级查找"env": {"node": true//此项指定环境的全局变量&#xff0c;下面的配置指定为nod…

iOS 17 / iPad OS 17屏蔽更新

iOS 17 / iPad OS 17屏蔽更新 1&#xff0c;进入屏蔽iOS更新的描述文件下载链接 下载链接 wx 搜索 Geek 前端发送屏蔽更新进行获取 2&#xff0c;复制这段链接&#xff0c;在Safari浏览器中打开&#xff0c;注意打开后别点击下载&#xff01;要先改时间&#xff01; 3&#…

【容器】k8s获取的节点oom事件并输出到node事件

在debug k8s node不可用过程中&#xff0c;有可能会看到: System OOM encountered, victim process: xx为了搞清楚oom事件是什么&#xff0c;以及如何产生的&#xff0c;我们做了一定探索&#xff0c;并输出了下面的信息。&#xff08;本文关注oom事件是如何生成&传输的&a…

python使用API实现word文档翻译

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享,包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概述Visual St…

如何确保UDP文件传输工具有最低稳定的传输速度?

在当前日新月异的数字时代背景下&#xff0c;文件传输工具已经成为我们日常生活与工作中不可或缺的一部分&#xff0c;尤其针对那些频繁涉及即时数据交互与多媒体流通的场景。 UDP协议&#xff0c;以其突出的高速传输与低延迟特性&#xff0c;脱颖而出成为众多用户的首选。不过…

代码审计之浅谈RASP技术

前言&#xff1a; 想摆会烂&#xff0c;所以就落个笔吧。 其实本来是想写关于iast技术的&#xff0c;但是认真思考了下&#xff0c;感觉笔者自己本身也不太能讲清楚iast技术&#xff0c;怕误人子弟。 所以最后还是基于笔者的理解以及实际应用写一篇关于RASP技术的文章&#xf…

虚幻引擎中的投影技术主要用于创建多屏交互式内容和沉浸式显示环境

首先&#xff0c;在虚幻引擎&#xff08;UE4&#xff09;中&#xff0c;nDisplay插件是一个强大的工具&#xff0c;它允许开发者创建多屏投影系统。这种系统可以是由多个相邻的物理屏幕组成&#xff0c;例如Powerwall显示器&#xff0c;或者使用多个投影仪将3D环境投射到物理表…

芋道系统springcloud模块启动报错,枚举类不能为空

问题描述&#xff1a; Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-05-10 15:50:15.756 | ERROR 9120 | main [TID: N/A] o.s.b.d.LoggingFailureAnalysisReporter | ************************…