【最小生成树】P2573 [SCOI2012] 滑雪

article/2025/6/8 0:41:28

题目

洛谷:P2573 [SCOI2012] 滑雪
在这里插入图片描述

分析

题目条件要点分析:

  • 这道题要求 i 能到达 j 的前提是 i 、j 之间有一条连通的边并且i 的高度比 j 高。这意味着本题给出的是一个有向图
  • 时间胶囊可以返回到上一个景点,可以无限使用,意味着可以返回到之前经历过的任意一个景点。这意味这个有向图可以回溯,那便可以进行 dfs 或者 bfs 。
  • “现在,a180285 站在 1 号景点望着山下的目标,心潮澎湃”,这句话表示 a180285 是从 1 号景点出发的,不能从其他地方出发。

问题分析:
题目要求出 “最多能到达多少个景点” 以及 “此时滑行的最短距离”。

  • “最多能到达多少个景点”: 潜台词就是说本题中的这个图是非连通图,要求从 1 号景点出发最多能连通多少个景点。
  • “此时滑行的最短距离”:求此时的最短距离,那么就是相当于求一个“最小生成树”,只不过在真正的最小生成树中要求:任意两顶点之间有且只有一条路径。而对于本题的这个“最小生成树”实际上它的每条边都是有方向的,因为只能从高顶点到低顶点。而时间胶囊的回溯功能又恰恰可以弥补这一点,所以这题是可以当成最小生成树来求的。

算法分析:

  • 对于第一问求最多能到达多少个景点,直接用一个 dfs 来实现,看看有多少景点连通。如果要用 dfs 那么就要建图,这里使用 vector 数组实现孩子表示法来建图。
  • 然后要求最短距离,我们使用 kruskal 算法来计算最小生成树的最小边权和,kruskal 算法是不需要建图的,它需要用一个数组统计所有边的信息,然后对边进行排序,依次拿出需要的边即可。那么现在虽然我们以及建图了,但是我们求最短路径不需要建图,我们需要记录边的信息,那怎么办呢?于是我们赋予 dfs 一个功能,在 dfs 的过程中再让 dfs 统计每条边的信息,方便后续进行 kruskal 算法

代码

#include<iostream>
#include<algorithm>
#include<vector>using namespace std;typedef long long LL;
typedef pair<int,int> PII;const int N = 1e5 + 10, M = 2e6 + 10;int fa[N];
int h[N];
int n,m;
bool st[N];vector<PII> edge[N]; //存图,用来dfs int pos;
struct node
{int x,y,z; //结构体用来存每个点到下一个点的信息 
}e[M]; //计算kruskal算法 LL cnt; //统计最多能到达多少个景点
LL ret; //此时最短的滑行距离总和 int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]); 
}void dfs(int u)
{cnt++;st[u] = true;for(auto& p:edge[u]) //遍历u可以到达的地方 {int y = p.first, z = p.second; pos++;e[pos].x = u, e[pos].y = y, e[pos].z = z;if(!st[y]) dfs(y); }
}bool cmp(node& a, node& b)
{int y1 = a.y, z1 = a.z, y2 = b.y, z2 = b.z;if(h[y1] != h[y2]) return h[y1] > h[y2];else return z1 < z2; 
}void kk()
{for(int i=1;i<=n;i++) fa[i] = i;sort(e + 1,e + 1 + pos, cmp);for(int i=1;i<=pos;i++) //循环到pos即可,不需要循环到m {int x = e[i].x, y = e[i].y, z = e[i].z;int fx = find(x), fy = find(y);if(fx != fy){ret += z;fa[fx] = fy;}		}
}int main()
{cin >> n >> m;for(int i=1;i<=n;i++) cin >> h[i];//存图 for(int i=1;i<=m;i++){int x,y,z; cin >> x >> y >> z;//方向就是从高高低 if(h[x] >= h[y]) edge[x].push_back({y,z});if(h[y] >= h[x]) edge[y].push_back({x,z});}dfs(1); //dfs出最多能到达多少个景点,并且记录这个连通图的每条边的信息。 cout << cnt << " "; kk();cout << ret << endl;return 0;} 

http://www.hkcw.cn/article/vPBsyDgLmI.shtml

相关文章

2.2.2 06年T2

Stratford的两大对立力量&#xff1a;令人讽刺的居民与令人同情的公司 - 2006年考研英语Text 2精析 本文解析2006年考研英语Text 2&#xff0c;揭示Stratford小镇居民与皇家莎士比亚剧团(RSC)的深层矛盾。 一、原文与翻译 Paragraph 1&#xff1a;对立双方的形成 L1: Stratfor…

基于人工智能算法实现的AI五子棋博弈

1. 项目概述 本项目实现了一个完整的五子棋游戏系统&#xff0c;包含游戏界面、交互逻辑和人工智能对战功能。 系统采用Python语言开发&#xff0c;使用Pygame库进行图形界面渲染&#xff0c;实现了三种游戏模式&#xff1a;人人对战、人机对战和AI对战。 AI算法基于博弈树搜…

在 Ubuntu 系统上使用 Python 的 Matplotlib 库时遇到的字体缺失问题

报错问题 findfont: Font family [SimHei] not found. Falling back to DejaVu Sans. 在现实图片时尝试显示中文字符命令行报错&#xff0c;在图片中显示方框。 最终解决方案 在尝试了各种方法之后&#xff0c;在代码中添加下图中选中行&#xff0c;问题直接解决。

webstrom中git插件勾选提交部分文件时却出现提交全部问题怎么解决

原因是我有个.husky的文件制定了执行提交的时候就是提交所有的文件 修改.husky/pre-commit文件就可以啦 #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"# 获取通过 WebStorm 提交的暂存文件&#xff08;仅勾选的部分&#xff09; STAGED_FILES$(gi…

KINGCMS被入侵

现象会强制跳转到 一个异常网站,请掉截图代码. 代码中包含经过混淆处理的JavaScript&#xff0c;它使用了一种技术来隐藏其真实功能。代码中使用了eval函数来执行动态生成的代码&#xff0c;这是一种常见的技术&#xff0c;恶意脚本经常使用它来隐藏其真实目的。 这段脚本会检…

CMS32M65xx/67xx系列CoreMark跑分测试

CMS32M65xx/67xx系列CoreMark跑分测试 1、参考资料准备 1.1、STM32官方跑分链接 1.2、官网链接 官方移植文档&#xff0c;如下所示&#xff0c;点击红框处-移植文档: A new whitepaper and video explain how to port CoreMark-Pro to bare-metal 1.3、测试软件git下载链接 …

Vue.js教学第十八章:Vue 与后端交互(二):Axios 拦截器与高级应用

Vue 与后端交互(二):Axios 拦截器与高级应用 在上一篇文章中,我们学习了 Axios 的基本用法,包括如何发送不同类型的 HTTP 请求以及基本的配置选项。本文将深入剖析 Axios 的拦截器功能,探讨请求拦截器和响应拦截器的作用、配置方法和应用场景,通过实例展示如何利用拦截…

【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3

❝ KubeSphere V4已经开源半年多&#xff0c;而且v4.1.3也已经出来了&#xff0c;修复了众多bug。介于V4优秀的LuBan架构&#xff0c;核心组件非常少&#xff0c;资源占用也显著降低&#xff0c;同时带来众多功能和便利性。我们决定与时俱进&#xff0c;使用1.30版本的Kubernet…

【判断酒酒花数】2022-3-31

缘由对超长正整数的处理&#xff1f; - C语言论坛 - 编程论坛 void 判断酒酒花数(_int64 n) {//缘由https://bbs.bccn.net/thread-508634-1-1.html_int64 t n; int h 0, j 0;//while (j < 3)h t % 10, t / 10, j;//整数的个位十位百位之和是其前缀while (t > 0)h t…

oauth2.0

OAuth 2.0 的工作原理和流程。 OAuth 2.0 是一个授权框架&#xff0c;它允许第三方应用获取对用户资源的有限访问权限&#xff0c;而无需获取用户的密码。以下是详细说明&#xff1a; 1. OAuth 2.0 的四个主要角色 资源所有者&#xff08;Resource Owner&#xff09; 通常是…

笔记本/台式C盘扩容:删除、压缩、跨分区与重分配—「小白教程」

删除C盘右侧分区以扩展 删除分区&#xff0c;也会删除分区中所有资料&#xff0c;请注意备份所有重要资料。 1.WinX选择磁盘管理&#xff0c;右键点击C盘右侧分区&#xff0c;选择删除卷&#xff0c;原分区会变成黑色的“未分配”空间&#xff1b; 2.此时右键C盘选择“扩展卷…

【Bluedroid】蓝牙启动之sdp_init 源码解析

本文围绕Android蓝牙协议栈中 SDP&#xff08;Service Discovery Protocol&#xff0c;服务发现协议&#xff09;模块的初始化函数sdp_init展开&#xff0c;结合核心控制块tSDP_CB及关联数据结构&#xff08;如tL2CAP_CFG_INFO、tCONN_CB等&#xff09;的定义与协作逻辑&#x…

C++学习-入门到精通【13】标准库的容器和迭代器

C学习-入门到精通【13】标准库的容器和迭代器 目录 C学习-入门到精通【13】标准库的容器和迭代器一、标准模板库简介1.容器简介2.STL容器总览3.近容器4.STL容器的通用函数5.首类容器的通用typedef6.对容器元素的要求 二、迭代器简介1.使用istream_iterator输入&#xff0c;使用…

UE5 2D角色PaperZD插件动画状态机学习笔记

UE5 2D角色PaperZD插件动画状态机学习笔记 0.安装PaperZD插件 这是插件下载安装地址 https://www.fab.com/zh-cn/listings/6664e3b5-e376-47aa-a0dd-f7bbbd5b93c0 1.右键创建PaperZD 动画序列 2.添加动画序列 3&#xff0c;右键创建PaperZD AnimBP &#xff08;动画蓝图&am…

你的台式机PCIe插槽到底是几条lane

目录 1.如何查看台式机支持的PCIe插槽的模式 2.查看台式机主板型号 3.主板PCIe插槽配置确认 4.实际模式与理论模式不匹配原因 5.解决方案 在【PCIe XDMA开发】XDMA与MIG位宽一致性要求一文中&#xff0c;我们讨论了PCIe带宽计算过程。那么实际带宽与理论计算带宽是否能够一致或…

微软PowerBI考试 PL300-Power BI 入门

Power BI 入门 上篇更新了微软PowerBI考试 PL-300学习指南&#xff0c;今天分享PowerBI入门学习内容。 简介 Microsoft Power BI 是一个完整的报表解决方案&#xff0c;通过开发工具和联机平台提供数据准备、数据可视化、分发和管理。 Power BI 可以从使用单个数据源的简单…

【论文阅读】Dolphin: Document Image Parsing via Heterogeneous Anchor Prompting

Paper&#xff1a;https://arxiv.org/abs/2505.14059 Source code: https://github.com/bytedance/Dolphin 作者机构&#xff1a;字节跳动 背景 业务场景 企业数据大多数都以文本、图片、扫描件、电子表格、在线文档、邮件等文档的形式存在&#xff0c;例如&#xff1a;PDF文…

WPS 利用 宏 脚本拆分 Excel 多行文本到多行

文章目录 WPS 利用 宏 脚本拆分 Excel 多行文本到多行效果需求背景&#x1f6e0; 操作步骤代码实现代码详解使用场景注意事项总结 WPS 利用 宏 脚本拆分 Excel 多行文本到多行 在 Excel 工作表中&#xff0c;我们经常遇到一列中包含多行文本&#xff08;用换行符分隔&#xff…

STM32外部中断(EXTI)以及旋转编码器的简介

一、外部中断机制概述 中断是指当主程序执行期间出现特定触发条件&#xff08;即中断源&#xff09;时&#xff0c;CPU将暂停当前任务&#xff0c;转而执行相应的中断服务程序&#xff08;ISR&#xff09;&#xff0c;待处理完成后恢复原程序的运行流程。该机制通过事件驱动…

【Unity开发】控制手机移动端的震动

&#x1f43e; 个人主页 &#x1f43e; 阿松爱睡觉&#xff0c;横竖醒不来 &#x1f3c5;你可以不屠龙&#xff0c;但不能不磨剑&#x1f5e1; 目录 一、前言二、Unity的Handheld.Vibrate()三、调用Android原生代码四、NiceVibrations插件五、DeviceVibration插件六、控制游戏手…