题解 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. 写Selenium代码时一些技巧

    本文地址: https://www.cnblogs.com/hchengmx/p/10880002.html 1. Chrome插件之"CSS Selector Helper for Chr ...

  2. Ubuntu 配置 .NET 使用环境

    本文迁移自Panda666原博客,原发布时间:2021年3月29日. 说明 测试使用的环境 Linux版本:Ubuntu Server 20.04 LTS x64 .NET SDK版本:5.0 其他版 ...

  3. 浅析Kubernetes架构之workqueue

    通用队列 在kubernetes中,使用go的channel无法满足kubernetes的应用场景,如延迟.限速等:在kubernetes中存在三种队列通用队列 common queue ,延迟队列 ...

  4. 机器学习中 TP FP TN FN的概念

    二分类 在二分类问题中,TP FP TN FN 是非常清楚且易于理解的. TP (True Positive) : 预测为 1 ,真实值也为 1 -> 真阳性 FP (False Positiv ...

  5. ASP.NET MVC之models_list传值view

    单个用户在查看个人信息时,一个model就能解决 但是如果是管理员,就需要查看多个用户,此时我们从数据库读一页的用户数据(大致十条) 此时返回的就可能是一个泛型列表 所以除了基本的用户model外(比 ...

  6. 使用C#编程语言开发Windows Service服务

    转载-https://www.cnblogs.com/yubao/p/8443455.html Create Windows Service project using Visual Studio C ...

  7. 【RocketMQ】消息的拉取

    RocketMQ消息的消费以组为单位,有两种消费模式: 广播模式:同一个消息队列可以分配给组内的每个消费者,每条消息可以被组内的消费者进行消费. 集群模式:同一个消费组下,一个消息队列同一时间只能分配 ...

  8. java.Scanner 拓展用法

    package study5ran2yl.study; import java.util.Scanner; public class demo11 { public static void main( ...

  9. 运行Flutter时连接超时

    这个墙不知道浪费了开发者多少的时间!!!!!!!!!!!!!!!!!!! 1.修改仓库地址为阿里仓库: 编辑android/build.gradle,把文件中的两处: google() jcenter ...

  10. shell脚本三剑客:grep、sed、awk

    shell脚本三剑客:grep  sed  awk grep语法: grep [OPTIONS] PATTERN [FILE] 常用选项 -c                       统计匹配到的 ...