[HNOI2012]矿场搭建

该博客详细分析了HNOI2012竞赛中的矿场搭建问题,重点探讨了如何处理图中的联通块和割点。文章指出,若坍塌的是割点,则会将联通块分割为两部分,每个部分至少需要一个出口确保通路。作者提出了三种情况的解决方案:(1)未连接割点的联通块需设两个出口;(2)仅连接一个割点的联通块设一个出口;(3)连接多个割点的联通块,任意点坍塌都可通过其他路径到达出口。最后,博客提供了相关的代码实现。

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

题目链接

算法:

        对于任何一个联通块,如果坍塌的是一个联通块中的割点的话,那么分割成的两个小联通块中必须保证各有一个出口。

       我们考虑所有的割点将原图分割成若干个小联通块接下来分类讨论:

        (1)小块不与任何一个割点相连,那我们需要在这里设立两个出口,以保证任何一个出口坍塌后,还有一个出口可用。

        (2)小块只与一个割点相连,那么我们只需要设立一个即可,出口没坍塌或割点坍塌了就直接用,如果出口坍塌了,那则可以通过没坍塌的割点去另一个小块的出口。

        (3)小块与超过一个割点相连,也就意味着,无论小块中的那个点塌了,都可以通过其他的点到另一个小块的出口。

 

Code:

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
    char c=getchar();num=0;T f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
    num*=f;
}
template<typename T> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值