「题解报告」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) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...
随机推荐
- C语言- 基础数据结构和算法 - 动态数组
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- 【clickhouse专栏】对标mongodb存储类JSON数据文档统计分析
一.文档存储的需求 很多的开发者都使用过mongodb,在mongodb中数据记录是以文档的形式存在的(类似于一种多级嵌套SQL的形式).比如下面的JSON数据结构:dev_ip表示某一台服务器的ip ...
- GIF录制工具下载
GIF录制工具(GifCam)下载地址: https://files.cnblogs.com/files/blogs/747754/GifCam.rar
- ExtJS直接加载HTML页面
ExtJS直接加载HTML页面 说明 ExtJS组件很不错,但再完美也有需要其他组件的时候,比如有时候就需要引入已经写好的HTML页面.主要的方法如下. 测试环境:ExtJS 7.4 使用html配置 ...
- 介绍一个好用的dao层与mybatis互跳的idea插件MyBatisCodeHelperPro
一次点击 File--> Settings --> Plugins -->搜索MyBatisCodeHelperPro,点击获取,重启idea即可 接下来看效果,点击小企鹅就可以相互 ...
- 第1期 考研中有关函数的一些基本性质《zobol考研微积分学习笔记》
在入门考研微积分中,我们先复习一部分中学学的初等数学的内容.函数是非常有用的数学工具. 1.函数的性质理解: 首先考研数学中的所有函数都是初等函数.而函数的三个关键就是定义域.值域.对应关系f. 其中 ...
- 揭开Vue异步组件的神秘面纱
简介 在大型应用里,有些组件可能一开始并不显示,只有在特定条件下才会渲染,那么这种情况下该组件的资源其实不需要一开始就加载,完全可以在需要的时候再去请求,这也可以减少页面首次加载的资源体积,要在Vue ...
- C语言求100以内的和的4种方式
C语言的一个很经典的例子,帮助熟练运行几个循环的写法 * 方法一(do---while语句) #include main () { int i,sum=0; do { sum=sum+i; i++; ...
- 浅学hello world
Hello world 1.随便新建一个文件夹,存放代码 2.新建一个java文件 .后缀名为.java .Hello.java .[注意点]系统没显示后缀名的可以自己手动打开 3.编写代码 publ ...
- Linux为所有用户安装Miniconda
如果以root身份默认安装,后续普通用户再安装的话,是直接用不起来的,需要改些东西,所以在安装时最好全局安装,所有用户都可用 执行安装脚本:sudo bash Miniconda3-latest-Li ...