题解 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的更多相关文章

  1. 「题解报告」 P3167 [CQOI2014]通配符匹配

    「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...

  2. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...

  3. 「题解报告」P2154 虔诚的墓主人

    P2154 虔诚的墓主人 题解 原题传送门 题意 在 \(n\times m\) 一个方格上给你 \(w\) 个点,求方格里每个点正上下左右各选 \(k\) 个点的方案数. \(1 \le N, M ...

  4. 「题解报告」Blocks

    P3503 Blocks 题解 原题传送门 思路 首先我们可以发现,若 \(a_l\) ~ \(a_r\) 的平均值大于等于 \(k\) ,则这个区间一定可以转化为都大于等于 \(k\) 的.我们就把 ...

  5. 「题解报告」P3354

    P3354 题解 题目传送门 一道很恶心的树形dp 但是我喜欢 题目大意: 一片海旁边有一条树状的河,入海口有一个大伐木场,每条河的分叉处都有村庄.建了伐木场的村庄可以直接处理木料,否则要往下游的伐木 ...

  6. 「题解报告」CF1067A Array Without Local Maximums

    大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...

  7. 「题解报告」P7301 【[USACO21JAN] Spaced Out S】

    原题传送门 神奇的5分算法:直接输出样例. 20分算法 直接把每个点是否有牛的状态DFS一遍同时判断是否合法,时间复杂度约为\(O(2^{n^2})\)(因为有判断合法的剪枝所以会比这个低).而在前四 ...

  8. 「GXOI / GZOI2019」简要题解

    「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...

  9. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

随机推荐

  1. 使用 .NET MAUI 创建移动应用——Get Start

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 1.IDE下载安装 如果你还没安装Visual Studio 2022 预览版 你 ...

  2. hyperlpr centos 使用记录

    1.下载最新版python3.7 Anacondawget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh 2.安装 ...

  3. Windows 启动过程

    引言 启动过程是我们了解操作系统的第一个环节.了解 Windows 的启动过程,可以帮助我们解决一些启动的问题,也能帮助我们了解 Windows 的整体结构. 以下内容将分为[加载内核].[内核初始化 ...

  4. 求求你们,别再刷 Star 了!这跟“爱国”没关系!

    这几年,随着几大互联网公司的强大,纷纷投入云计算产业的建设,开源项目作为维护潜在客户群体(开发者)的重要手段,是各大云计算厂商都在努力做的事. 这几年也诞生了很多真正优秀和看似优秀的开源项目.真正优秀 ...

  5. Tapdata Cloud 2.1.5来啦:新增支持Amazon RDS数据库,错误日志查询更便捷,Agent部署细节再优化

      需求持续更新,优化一刻不停--Tapdata Cloud 2.1.5 来啦!   最新发布的版本中,数据连接再上新,同时新增任务报错相关信息快速查询入口,开始支持 JVM 参数自定义设置.   更 ...

  6. Tapdata 与阿里云 PolarDB 开源数据库社区联合共建开放数据技术生态

      近日,阿里云 PolarDB 开源数据库社区宣布将与 Tapdata 联合共建开放数据技术生态.在此之际,一直专注实时数据服务平台的 Tapdata ,也宣布开源其数据源开发框架--PDK(Plu ...

  7. idea201903License

    License name: https://zhile.io Activation code: 3AGXEJXFK9-eyJsaWNlbnNlSWQiOiIzQUdYRUpYRks5IiwibGljZ ...

  8. Solution -「营业」「CF567D」One-Dimensional Battle Ships

    题目大意 - 翻译   Alice 和 Bob喜欢在 \(1\times n\) 的表格中玩战舰游戏.游戏开始时,Alice 有 \(k\) 艘战舰,每艘战舰长度为 \(a\),她需要把这些战舰不重叠 ...

  9. BZOJ1874 「一本通 6.7 练习 1」【一本通提高博弈论】取石子游戏

    「一本通 6.7 练习 1」取石子游戏 题目描述 小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游 ...

  10. java后端分片上传接口

    文件上传工具--FileUtil package com.youmejava.chun.util; import lombok.Data; import org.apache.tomcat.util. ...