「题解报告」SP16185 Mining your own business
题解 SP16185 Mining your own business
题意
给你一个无向图,求至少安装多少个太平井,才能使不管那个点封闭,其他点都可以与有太平井的点联通。
题解
其他题解里都说要用“点双连通分量”,其实不用。
我们先用tarjan求出所有割点,然后我们假设所有的割点都坍塌掉了,整张图就被我们分成了许多联通块,我们可以用暴搜找出所有联通块。每个联通块与割点有如下关系(s表示一个联通块的点的数量):
这个联通块与0个割点直接连接:说明这个联通块与其他联通块不相连。此时要在这个联通块里安两个太平井才可以(有可能一个太平井坍塌了,所以要两个)。方案数为 \(\frac{n*(n-1)}{2}\)。
这个联通块与1个割点直接连接:如果与它相连的这个割点坍塌掉了,那这个联通块的所有点就逃不出去了,所以我们要往这个联通块里放一个太平井,即使这个太平井坍塌了,这个联通块的其它点也可以从割点逃出去。方案数为 \(s\)。
这个联通块与2及以上个割点直接连接:不管周围那个割点坍塌掉了,这个联通块的点都可以从其它割点逃出去,所以不用安太平井。
Code
#include <bits/stdc++.h>
#define _for(i,a,b) for(ll i=a;i<=b;++i)
#define for_(i,a,b) for(ll i=a;i>=b;--i)
#define ll long long
using namespace std;
const ll N=50010,inf=0x3f3f3f3f;
ll T,n,m,x,y,ans1,ans2,cnt_ge[N];
ll dfn[N],low[N],jl[N],cnt,num,c[N],ge[N];
ll df[N],s,co[N];
vector<ll>tu[N];
stack<ll>st;
map<ll,map<ll,ll> >jl_ge;
void clear(){
n=0,m=0,x=0,y=0,ans1=0,ans2=1,cnt=0,num=0,s=0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(jl,0,sizeof(jl));
memset(c,0,sizeof(c));
memset(ge,0,sizeof(ge));
memset(df,0,sizeof(df));
memset(cnt_ge,0,sizeof(cnt_ge));
memset(co,0,sizeof(co));
jl_ge.clear();
_for(i,1,N)tu[i].clear();
}void tarjan(ll u,ll root){
low[u]=dfn[u]=++cnt;
st.push(u),jl[u]=1;
ll sz=tu[u].size(),x=0,sum=1;
_for(i,0,sz-1){
ll v=tu[u][i];
if(!dfn[v]){
tarjan(v,root),low[u]=min(low[u],low[v]);
if(dfn[u]<=low[v])
if(u!=root||(++x)>1)ge[u]=1;
}else low[u]=min(low[u],dfn[v]);
}
}void dfs(int u,int fa,int color){
int sz=tu[u].size();
++co[color],df[u]=1;
_for(i,0,sz-1){
int v=tu[u][i];
if(v==fa||df[v])continue;
if(ge[v]){
if(!jl_ge[color][v]){
++cnt_ge[color];
jl_ge[color][v]=1;
}continue;
}dfs(v,u,color);
}
}int main(){
while(++T){
clear();
scanf("%lld",&m);
if(m==0)break;
_for(i,1,m){
scanf("%lld%lld",&x,&y);
tu[x].push_back(y);
tu[y].push_back(x);
n=max(n,max(x,y));
}_for(i,1,n)if(!dfn[i])tarjan(i,i);
_for(i,1,n){
if(!ge[i]&&!df[i]){
dfs(i,i,++s);
if(cnt_ge[s]==1)++ans1,ans2*=co[s];
if(cnt_ge[s]==0)ans1+=2,ans2*=co[s]*(co[s]-1)/2;
}
}printf("Case %lld: %lld %lld\n",T,ans1,ans2);
}return 0;
}
「题解报告」SP16185 Mining your own business的更多相关文章
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- 「题解报告」P4577 [FJOI2018]领导集团问题
题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...
- 「题解报告」P2154 虔诚的墓主人
P2154 虔诚的墓主人 题解 原题传送门 题意 在 \(n\times m\) 一个方格上给你 \(w\) 个点,求方格里每个点正上下左右各选 \(k\) 个点的方案数. \(1 \le N, M ...
- 「题解报告」Blocks
P3503 Blocks 题解 原题传送门 思路 首先我们可以发现,若 \(a_l\) ~ \(a_r\) 的平均值大于等于 \(k\) ,则这个区间一定可以转化为都大于等于 \(k\) 的.我们就把 ...
- 「题解报告」P3354
P3354 题解 题目传送门 一道很恶心的树形dp 但是我喜欢 题目大意: 一片海旁边有一条树状的河,入海口有一个大伐木场,每条河的分叉处都有村庄.建了伐木场的村庄可以直接处理木料,否则要往下游的伐木 ...
- 「题解报告」CF1067A Array Without Local Maximums
大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...
- 「题解报告」P7301 【[USACO21JAN] Spaced Out S】
原题传送门 神奇的5分算法:直接输出样例. 20分算法 直接把每个点是否有牛的状态DFS一遍同时判断是否合法,时间复杂度约为\(O(2^{n^2})\)(因为有判断合法的剪枝所以会比这个低).而在前四 ...
- 「GXOI / GZOI2019」简要题解
「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...
- 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)
[题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...
随机推荐
- Camunda开源流程引擎快速入门——Hello World
市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda.由于jbpm.activiti.flowable这几个流程引擎出现的比较早,国内人用的 ...
- 牛亚男:基于多Domain多任务学习框架和Transformer,搭建快精排模型
导读: 本文主要介绍了快手的精排模型实践,包括快手的推荐系统,以及结合快手业务展开的各种模型实战和探索,全文围绕以下几大方面展开: 快手推荐系统 CTR模型--PPNet 多domain多任务学习框架 ...
- 根据数据中的key获取value值
一.测试数据准备 List<Map<String, String>> result = new ArrayList();Map<String, String> ma ...
- 高级web网页人脸识别tracking.js
what?你没有看错,强大的JavaScript也可以实现人脸识别功能.小编精心整理了一个人脸识别的JavaScript库(tracking.js),通过这篇文章,你可以了解到如何在网页中实现一个人脸 ...
- 我大抵是卷上瘾了,横竖睡不着!竟让一个Bug,搞我两次!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:一个Bug 没想到一个Bug,竟然搞我两次! 我大抵是卷上瘾了,横竖都睡不着,坐起来 ...
- awk内置函数、外部变量
外部变量 ①获取外部变量 格式: awk '{action}' 变量名=变量值 ,这样传入变量可以在action中获得值. 示例: test='awk test'--day-5 外部变量 ①获取外部变 ...
- Ubuntu系统iptables安全防护整改计划
端口开放 默认防火墙是开放所有端口的,如果拿来做应用服务器,就很危险,所以要把防火墙用起来,只将需要的端口开放,ubuntu用的是iptables防火墙. iptables处理流程 iptables ...
- Json多层级动态结构数据解析
一.工具 (1)GSON Google Gson是一个简单的基于Java的库,用于将Java对象序列化为JSON,反之亦然. 它是由Google开发的一个开源库. 以下几点说明为什么应该使用这个库 - ...
- 6. RDD综合练习:更丰富的操作
集合运算练习 union(), intersection(),subtract(), cartesian() 内连接与外连接 join(), leftOuterJoin(), rightOuterJo ...
- 初始化二维列表时使用[ [0]* N ] * K会出现的问题
声明二维列表使用[ [0]* N ] * K会出现的问题 初始化二维列表时使用[ [0]* N ] * K创建,外层列表的每一个元素地址相同: 创造了一个二维列表: 修改其中的一个元素a[1][1], ...