P8802 [蓝桥杯 2022 国 B] 出差

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.hqwc.cn/news/685646.html

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

相关文章

Minio(官方docker版)容器部署时区问题研究记录

文章目录 感慨&概述补充&#xff1a;MINIO_REGION和容器时间的关系 问题一&#xff1a;minio容器和本地容器时间不一致问题说明原因探究解决方法结果验证 问题二&#xff1a;minio修改时间和本地查询结果不一致具体问题原因探究解决办法时间转化工具类调用测试和验证上传文…

etcd单机部署和集群部署

1、etcd单实例部署 对于平常的学习&#xff0c;其实搭建一个单机节点是够了的。接下来就讲讲怎么搭建单机节点。 本次部署是在 centos7 系统&#xff0c;cpu 为amd64 上面进行的。 部署是直接使用官方编译好的二进制文件&#xff0c;大家也可以直接看 ectd-releases 界面选择…

有什么方便实用的黏土特效教程?6个软件教你快速进行特效制作

有什么方便实用的黏土特效教程&#xff1f;6个软件教你快速进行特效制作 作为时尚小达人&#xff0c;你自己是否想要制作出属于自己的黏土特效照片呢&#xff1f;比如下面几种。 看到这些黏土特效软件有没有心动&#xff0c;下面我也为大家详细的介绍一下可以制作出对应特效的…

邻域注意力Transformer

邻域注意力&#xff08;NA&#xff09;&#xff0c;这是第一个高效且可扩展的视觉滑动窗口注意力机制&#xff0c;NA是一种逐像素操作&#xff0c;将自注意力&#xff08;SA&#xff09;定位到最近的相邻像素&#xff0c;因此与SA的二次复杂度相比&#xff0c;具有线性时间和空…

数据库被攻击后出现1044 - access denied for user ‘root‘@‘% ‘ to database table

MySQL数据库被攻击后&#xff0c;数据库全部被删除&#xff0c;并且加一个一个勒索的数据&#xff0c;向我索要btc&#xff0c; 出现这个问题就是我的数据库密码太简单了&#xff0c;弱密码&#xff0c;被破解了&#xff0c;并且把我权限也给修改了 导致我操作数据库时&#…

AI英语口语训练软件有哪些?这4款简单易用

AI英语口语训练软件有哪些&#xff1f;AI英语口语训练软件在现代语言学习中确实扮演着举足轻重的角色。它们凭借先进的智能算法&#xff0c;能够为我们量身定制学习方案&#xff0c;精准识别并纠正发音错误&#xff0c;模拟真实对话场景&#xff0c;使学习过程更加高效、有趣。…

【动态规划】子序列问题

最长上升子序列 题目描述&#xff1a; 解题思路&#xff1a; 核心思路&#xff1a; 用f[i]:表示以第i个数结尾的最大子序列&#xff0c;只需要找到比第i个小的最大子序列再加上1 即可&#xff1b; ----> f[i]max(f[j]1,f[i]); 定义 f[i] 表示以第 i 个元素结尾的最长上升子…

代码随想录算法训练营第36期DAY18

DAY18 二叉树的层序遍历 102二叉树的层序遍历 “队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。” 二叉树层序遍历模版&#xff1a; /** * Definition for a binary tree node. * struct TreeNode { *…

基于torch_dispatch机制生成Megatron-DeepSpeed调用关系图

基于torch_dispatch机制生成Megatron-DeepSpeed调用关系图 一.局部效果图二.运行训练过程,拦截算子,生成调用关系信息三.可视化,生成SVG图像 想知道Megatron-DeepSpeed训练过程中各模块之间的调用关系。torch_dispatch机制可以拦截算子,inspect又能获取到调用栈(文件,类名,函数…

《引爆流量获客技术》实操方法,手把手教你搭建盈利流量池

[1]-先导课.mp4 [2]-第1节&#xff1a;设计客户终身价值的方法和买客户思维.mp4 [3]-第2节&#xff1a;【渠道模型】解决谁是我的客户如何找到.mp4 [4]-第3节&#xff1a;【诱饵模型】解决 如何获得更多的客户.mp4 [5]-第4节&#xff1a;【钩子模型】解决让目标客户主动找你…

轮式机器人

迄今为止,轮子一般是移动机器人学和人造交通车辆中最流行的运动机构。它可达到很高的效率, 如图所示, 而且用比较简单的机械就可实现它的制作。 另外,在轮式机器人设计中,平衡通常不是一个研究问题。 因为在所有时间里,轮式机器人一般都被设计成在任何时间里所有轮子均与地接…

milvus元数据在etcd的存储解析

milvus元数据在etcd的存储解析 数据以key-value形式存在。 大致包含如下一些种类: databasecollectionfieldpartitionindexsegment-indexresource_groupsession database 创建一个数据库会产生2个key&#xff0c;但value是相同的。 key规则: 前缀/root-coord/database/db…