首页 > 其他分享 >[luoguP2573/SCOI2012]滑雪

[luoguP2573/SCOI2012]滑雪

时间:2024-11-11 21:20:48浏览次数:1  
标签:cnt return idx luoguP2573 int ht 景点 滑雪 SCOI2012

题意

给定一个有 \(n\) 个景点和 \(m\) 条边的无向图,景点有高度 \(h_i\)。从景点 \(i\) 到 \(j\) 的移动仅当 \(h_i \geq h_j\) 且有边 \((i, j)\)。从景点 \(1\) 出发,使用最短距离访问最多景点,且可使用回溯道具回到上一个点。求最多景点数和最短距离。

sol

如果本题无高度限制,那么这道题就是一道很水的最小生成树题目。但幸运的是,即便加入了高度限制,也可以很简单的建出图并计算出可以到达的最多景点数,去掉无法到达的边和点后,可以得到一个新图,包含所有可能遍历到的边和点。因此对这个图计算最小生成树即可。
在使用 Kruskal 时,需要注意:为使其可以遍历到所有点,需要将终点高度作为第一关键字(从大到小),边权作为第二关键字(从小到大)进行排序,原因如下:
记所有位于当前生成树中的点集为 \(S\),\(S\) 可一步到达的点中,其中高度最高的点必定要选,因为若选择了高度更小的点 ,则会出现高度更高的点无法被选的情况。

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 100005, M = 2000005;

int h[N], e[M], w[M], ne[M], idx;
bool st[N];
int ht[N];
int n, m;
int edge_cnt;
int cnt;
int fa[N];

struct Edge {
    int a, b, c;

    bool operator< (const Edge &W) const{
        if (ht[b] != ht[W.b]) return ht[b] > ht[W.b];
        return c < W.c;
    }
}edges[M];

void add(int a, int b, int c){
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

void dfs(int u){
    if (st[u]) return ;
    cnt ++ ;
    st[u] = true;

    for (int i = h[u]; ~i; i = ne[i]){
        int j = e[i];
        edges[ ++ edge_cnt] = {u, j, w[i]};
        dfs(j);
    }
}

int find(int x){
    if (fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}

int main(){
    memset(h, -1, sizeof h);

    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &ht[i]);
    while (m -- ){
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        int ha = ht[a], hb = ht[b];
        if (ha == hb) add(a, b, c), add(b, a, c);
        else if (ha > hb) add(a, b, c);
        else add(b, a, c);
    }

    dfs(1);
    printf("%d ", cnt);

    sort(edges + 1, edges + edge_cnt + 1);
    for (int i = 1; i <= n; i ++ ) fa[i] = i;

    long long cost = 0;
    for (int i = 1; i <= edge_cnt; i ++ ){
        int faa = find(fa[edges[i].a]), fab = find(fa[edges[i].b]);
        if (faa == fab) continue;
        cost += edges[i].c;
        fa[faa] = fab;
    }

    printf("%lld\n", cost);

    return 0;
}

标签:cnt,return,idx,luoguP2573,int,ht,景点,滑雪,SCOI2012
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/luoguP2573

相关文章

  • Python小游戏19——滑雪小游戏
    运行效果 python代码importpygameimportrandom #初始化Pygamepygame.init() #设置屏幕尺寸screen_width=800screen_height=600screen=pygame.display.set_mode((screen_width,screen_height))pygame.display.set_caption("滑雪小游戏") #定义......
  • java计算机毕业设计基于的滑雪场学具租赁管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会经济的发展以及人们生活水平的提高,滑雪运动逐渐成为大众喜爱的休闲娱乐项目。滑雪场的规模不断扩大,雪具租赁业务量也日益增长。然而,传统......
  • #E. 滑雪与时间剂
    #E.滑雪与时间剂题意有N个点,每个点有自己的高度,只能从高处到低处如果一条边两边高度不同,则路为单向,否则为双向他可以随时回到之前的任意一点,从1点出发,在满足到的点尽可能多的情况下求最小距离分析对于任意点来说,只能从比他更高(或一样高)的点走到所以按照高度作为第一关......
  • 基于nodejs+vue滑雪场管理系统[程序+论文+开题] 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着冬季运动的日益普及,滑雪场作为冰雪运动的重要载体,其管理与运营效率直接关系到游客体验、安全保障及经济效益。然而,传统的人工管理模式在面对大规模游客......
  • 基于nodejs+vue滑雪管理系统[程序+论文+开题] 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着冬季运动的兴起,滑雪作为一项集休闲、健身与竞技于一体的运动,在全球范围内受到了广泛的欢迎与追捧。然而,传统滑雪管理方式往往依赖于人工操作,存在效率低......
  • Springboot滑雪场管理信息系统2ad0e--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着冬季运动的普及和滑雪旅游的兴起,滑雪场作为重要的冬季旅游目的地,其运营管理面临着日益复杂的挑战。传统的人工管理方式已难以满足......
  • 基于springboot滑雪场管理系统源码和论文
    滑雪场管理系统的设计与实现摘要近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定滑雪场管理系统的总体功能模块。然后,详细设计系统的主要功能模块,通过数据库设计过程......
  • P2336 [SCOI2012] 喵星球上的点名 解题报告
    oj:https://gxyzoj.com/d/gxyznoi/p/P107SA+莫队调了一天,真的心态炸了,总的来说这道题没有一步是好想的首先,看到是多个字符串求一个是另一个子串,显然想到,讲这些字符串拼接起来,因为姓和名不能连在一起,所以可以在他们中间加一个没有出现的数字接下来,首先考虑第一个问题在拼接完后......
  • P10432 [JOISC 2024 Day1] 滑雪 2
    MyBlogsP10432[JOISC2024Day1]滑雪2感觉是挺好的观察性质题,vp的时候场切了。首先酒店一定是建在最低的某一个点。把高度离散化之后,把点扔到对应的位置。可以发现高度为\(i\)的层的所有点,如果能接上一层的连接器那一定会尽量接上(因为到了下一层它本身也可以贡献一个空......
  • LOJ#4149. 「JOISC 2024 Day1」滑雪 2
    首先,不存在\(H_i<H_j\)时增高\(H_i\)至\(H_j+1\)后连\(i\toj\)更优,因为增高后原来能连\(i\)的点现在不一定能连\(i\)了,原来能连\(j\)的点还是能连\(j\),此时的方案集必然是原方案集的子集,答案一定不会更优,又因为你付出了增高的费用,所以这样一定劣。那么我们......