洛谷 - P3225 - 矿场搭建 - 双连通分量
https://www.luogu.org/problem/P3225
这个东西有点绕。
最平凡的情况,整个原图只有一个点,那么它坍塌了之后就没有点了,不需要进行任何逃生。否则,当一个点坍塌之后,每个其他点的工人都要逃向逃生出口。
首先把双连通分量缩点,缩点完成之后必定是一片森林,树与树之间是乘法原理。
单独考虑一棵树。
平凡的情况,只有一个根节点,没有边。
这种情况下,假如原图中该双连通分量中有>=2个点,则这个双连通分量中要建立2个出口(其中一个出口坍塌了,都可以从另一个出口走),否则假如只有一个点,则只需要建立1个出口。
不平凡的情况,是一棵无根树。必定存在叶子,每个叶子都必须建立1个出口。这个出口必须建立在非原图割点的位置,假如原图这个双连通分量没有割点(这个双连通分量只有一个点,去掉都没没事),则不需要加。
不是叶子的情况,当其他节点坍塌,则必定可以去到至少1个叶子节点逃生,不需要建立逃生出口。当自己(且自己只有一个点)坍塌,每个子树自己跑去自己的叶子就可以了。
那么先特判掉n=1的情况。然后在原图中跑出原图的割点。然后遍历一遍原图的点,从没有被访问过的非割点进入,搜索连接的所有非割点,这些非割点都属于这个双连通分量,而搜索到的割点也属于这个双连通分量不过不需要进去。这样会漏掉两个割点之间的所有非割点和割点,不过这貌似没有问题?因为假如都有两个非割点了,答案就是0了。而且环的另一个半(或者1/3,或者1/4)也会搜索到那两个割点的,反正都是0。
假如只有一个割点,则这个是缩点后图的叶子,贡献C(非割点数量,1)。
假如有多于两个割点,则不贡献,少数的非割点和割点都无所谓了
假如没有割点,则这个双连通分量缩点之后只剩下自己一个点作为树,那么也是贡献C(非割点数量,2),(当该双连通分量有多于两个点时),或者0(当该双连通分量只有1个点时)。
各个双连通分量之间选点独立,各个树之间选点独立,全部乘法叠加。
从这道题可以得到一个常识:每个割点不一定仅属于一个双连通分量,比如一个dio型图。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 505;
int n;
vector<int> G[MAXN];
int dfn[MAXN], low[MAXN], dfncnt;
bool cut[MAXN];
int vis[MAXN], viscol;
int cntcut, cntncut;
void init() {
for(int i = 1; i <= 500; ++i)
G[i].clear();
dfncnt = 0;
memset(cut, false, sizeof(cut));
memset(vis, false, sizeof(vis));
memset(dfn, false, sizeof(dfn));
memset(low, false, sizeof(low));
viscol = 1;
}
void tarjan(int u, int p) {
low[u] = dfn[u] = ++dfncnt;
ll sum = 0;
int ch = 0;
for(auto v : G[u]) {
if(!dfn[v]) {
tarjan(v, u);
low[u] = min(low[u], low[v]);
if(p == -1)
ch++;
else if(low[v] >= dfn[u])
cut[u] = true;
} else
low[u] = min(low[u], dfn[v]);
}
if(ch >= 2)
cut[u] = true;
}
void dfs(int u, int p) {
//cout << "u=" << u << endl;
vis[u] = viscol;
++cntncut;
for(auto v : G[u]) {
if(vis[v] != viscol) {
vis[v] = viscol;
if(cut[v])
++cntcut;
else
dfs(v, u);
}
}
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int m, kase = 1;
while(~scanf("%d", &m)) {
if(m == 0)
return 0;
init();
n = 0;
for(int i = 1, u, v; i <= m; ++i) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
n = max(n, max(u, v));
}
for(int i = 1; i <= n; ++i) {
if(!dfn[i])
tarjan(i, -1);
/*if(cut[i])
printf("cut=%d\n",i);*/
}
unsigned long long sum1 = 0;
unsigned long long sum2 = 1;
for(int i = 1; i <= n; ++i) {
if(!vis[i] && !cut[i]) {
//cout<<"viscol="<<viscol<<endl;
cntcut = cntncut = 0;
dfs(i, -1);
if(cntcut == 0) {
if(cntncut >= 2) {
sum1 += 2;
sum2 *= cntncut * (cntncut - 1) / 2;
} else {
sum1 += 1;
}
} else if(cntcut == 1) {
++sum1;
sum2 *= cntncut;
} else
;
viscol++;
}
}
printf("Case %d: %llu %llu\n", kase++, sum1, sum2);
}
return 0;
}
洛谷 - P3225 - 矿场搭建 - 双连通分量的更多相关文章
- BZOJ2730:[HNOI2012]矿场搭建(双连通分量)
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- Tarjan 点双+割点+DFS【洛谷P3225】 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 洛谷——P3225 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 【洛谷P3225】[HNOI2012]矿场搭建
矿场搭建 题目链接 根据题意,发生事故时会有一个挖煤点坍塌, 只有当这个点是割点,会对图的连通性产生影响, 我们首先Tarjan一遍找到所有割点,将原图除去这些割点后, 遍历一遍,找出所有连通块,分三 ...
- Solution -「洛谷 P5827」边双连通图计数
\(\mathcal{Description}\) link. 求包含 \(n\) 个点的边双连通图的个数. \(n\le10^5\). \(\mathcal{Solution}\) ...
- Solution -「洛谷 P5827」点双连通图计数
\(\mathcal{Description}\) link. 求有 \(n\) 个结点的点双连通图的个数,对 \(998244353\) 取模. \(n\le10^5\). \(\mat ...
- 洛谷P3225 HNOI2012 矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
- 洛谷—— P3225 [HNOI2012]矿场搭建
https://www.luogu.org/problem/show?pid=3225 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有 ...
随机推荐
- MCMC
MCMC MCMC算法的核心思想是我们已知一个概率密度函数,需要从这个概率分布中采样,来分析这个分布的一些统计特性,然而这个这个函数非常之复杂,怎么去采样?这时,就可以借助MCMC的思想. 它与变分自 ...
- sh_09_字典的定义
sh_09_字典的定义 # 字典是一个无序的数据集合,使用print函数输出字典时,通常 # 输出的顺序和定义的顺序是不一致的! xiaoming = {"name": " ...
- 文章翻译:ABP如何在EF core中添加数据过滤器
原文地址:https://aspnetboilerplate.com/Pages/Documents/Articles%5CHow-To%5Cadd-custom-data-filter-ef-cor ...
- BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)
题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...
- js几种加密方法
1.base64加密 它的github地址:https://github.com/dankogai/js-base64 <!DOCTYPE HTML> <html> <h ...
- JS框架_(JQuery.js)模拟刮奖
百度云盘:传送门 密码:6p5q 纯CSS模拟刮奖效果 <!DOCTYPE html> <html lang="en"> <head> < ...
- linux下安装R第三方包forecast
ERROR: [root@localhost soft]# R CMD INSTALL curl_3.1.tar.gz WARNING: ignoring environment value of R ...
- WordPress 主题开发:从入门到精通(必读)
本专栏介绍如何开发设计你自己的 WordPress 主题.如果你希望了解更多如何安装和应用主题的内容,请参阅应用主题文档.本文的内容不同于应用主题,因为所讨论的是编写代码去构建你自己的主题的技术内容, ...
- LeetCode19----删除链表的指定元素
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- 三种CSS样式
内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌入式和外部式三种. 内联式css样式表就是把css代码直接 ...