BZOJ 2753 SCOI 2012 滑雪与时间胶囊 最小生成树

博客讲述了如何解决BZOJ 2753问题,该问题涉及到滑雪路线规划。第一问通过简单的BFS求解,而第二问则需要利用最小生成树的思路。由于图中边是单向的,常规的朱刘算法不适用。作者通过改变边的排序策略,结合高度信息和强连通分量的概念,证明了可以使用MST解决此问题。最终,通过缩点处理和从高到低的SCC分析,实现了O(mlogm)的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:在滑雪场中,每一个景点有一个高度。现在小明在一号节点。i和j之间有单向边当且仅当i的高度不高于j。问小明最多可以去多少个景点,和最小总费用。


思路:这是一道数学证明的好题。

第一问比较水,直接将可行的边连接起来,然后BFS出解。

第二问就比较难搞了。不难看出,直接用朱刘算法是不可行的,因为朱刘算法的时间复杂度达到了O(mn),而这个题至少需要一个O(mlogm)的算法。

恩?你说mlogm?难道是最小生成树?但是这图中都是单向边啊。

经过了上网找题解,和同学研究之后,终于弄明白了这题的精髓。简要说明一下做法和正确性。

做法很简单。只需要改变一下边的排序,第一键值为终点的高度,第二键值为边的权值。然后正常跑MST就行了。可这是为什么?

首先明确,在一个高度中,两点之间有边就一定是双向边。那么在一个高度且有边的点会形成一个强连通分量。将所有能够从1遍历到的点进行缩点之后,图会变成以1所在的SCC为起点的可拓扑图(因为高度比1还高的点一定无法到达,所以没有边)。

之后从上向下考虑,每一个SCC的高度一定是一样的。而终点为这个高度的边有两种,一种是从更高处的SCC连到这个高度的SCC的单向边,和这个SCC中的双向边,在处理这一层的时候,可以吧这两种边都看成是无向边,也就可以套用正常的MST了。


CODE:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 2000010
using namespace std;
 
int h[MAX];
 
struct Edge{
    int x,y,length;
     
    bool operator <(const Edge &a) const {
        if(h[y] =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值