BZOJ2730——[HNOI2012]矿场搭建
bzoj2730 & world final 2011 H
1、题目大意:就是有一个无向图,让你在里面选择点,使得,无论哪个点没了以后,其他的点都能到达你选择的任何一个点,输出最少
选择几个点,和选择最少的方案数,最多有500条边。
2、分析:首先我们想如果没得不是割顶,那么其他的都无所谓了。
然后如果没有割顶,那就是选两个点,(避免其中你选的点没了)
如果有,我们把所有的割顶去掉,得到一些连通分量,那么如果一个连通分量里连着不止一个割顶,这个连通分量就可以去别 的连通分量里,如果只连着一个割顶,那么这个联通分量里就要选一个点了,选哪个点无所谓,因为是双联通分量啊,我不是
把割顶都去掉了吗,最后乘法原理什么的,搞一搞就过了,交了那么多次,居然是因为最后输出没用 long long,浪费我的提交
次数,加一个优化,如果一个连通分量已经dfs到它连着超过1个更定了,就结束dfs
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define LL long long LL head[100100], next[100100]; LL u[100100], v[100100]; LL pre[100010]; bool iscut[100010]; LL cnt1; bool vis[100010]; LL dfs_clock; LL block[100010]; LL cnt2; LL kk[100010], tot; bool vis_block[100010]; LL dfs(LL x, LL fa){ LL lowx = pre[x] = ++ dfs_clock; LL cnt = 0; for(LL i = head[x]; i != -1; i = next[i]){ LL y = v[i]; if(!pre[y]){ cnt ++; LL lowy = dfs(y, x); lowx = min(lowx, lowy); if(lowy >= pre[x]) iscut[x] = true; } else if(pre[y] < pre[x] && y != fa){ lowx = min(lowx, pre[y]); } } if(cnt == 1 && fa < 0) iscut[x] = false; return lowx; } void solve(LL x, LL fa){ vis[x] = 1; block[x] = cnt1; for(LL i = head[x]; i != -1; i = next[i]){ LL y = v[i]; if(!vis[y]){ solve(y, x); } } } void get_ans(LL x, LL fa){ vis[x] = 1; cnt2 ++; if(cnt1 > 1) return; for(LL i = head[x]; i != -1; i = next[i]){ LL y = v[i]; if(cnt1 > 1) return; if(!vis[y]){ if(iscut[y]){ vis[y] = true; kk[++ tot] = y; cnt1 ++; continue; } get_ans(y, x); } } } int main(){ LL n; LL h = 0; while(scanf("%lld", &n) != EOF){ if(n == 0) return 0; h ++; memset(head, -1, sizeof(head)); LL m = 0; for(LL i = 1; i <= n; i ++){ scanf("%lld%lld", &u[2 * i - 1], &v[2 * i - 1]); m = max(m, u[2 * i - 1]); m = max(m, v[2 * i - 1]); u[2 * i] = v[2 * i - 1]; v[2 * i] = u[2 * i - 1]; next[2 * i - 1] = head[u[2 * i - 1]]; head[u[2 * i - 1]] = 2 * i - 1; next[2 * i] = head[u[2 * i]]; head[u[2 * i]] = 2 * i; } dfs_clock = 0; memset(iscut, 0, sizeof(iscut)); memset(pre, 0, sizeof(pre)); LL wl = dfs(1, -1); for(LL i = 1; i <= m; i ++) vis[i] = iscut[i]; for(LL i = 1; i <= m; i ++){ if(!vis[i]){ cnt1 ++; solve(i, -1); } } memset(vis, 0, sizeof(vis)); LL ans1 = 0, ans2 = 1; tot = 0; memset(vis_block, 0, sizeof(vis_block)); for(LL i = 1; i <= m; i ++){ if(!iscut[i] && !vis[i] && !vis_block[block[i]]){ cnt1 = 0; cnt2 = 0; get_ans(i, -1); if(cnt1 == 1){ ans1 ++; ans2 *= cnt2; } for(LL j = 1; j <= tot; j ++){ vis[kk[j]] = 0; } tot = 0; vis_block[block[i]] = 1; } } if(ans1 == 0) printf("Case %lld: 2 %lld\n", h, m * (m - 1) / 2); else printf("Case %lld: %lld %lld\n", h, ans1, ans2); } return 0; }
BZOJ2730——[HNOI2012]矿场搭建的更多相关文章
- bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1147 Solved: 528[Submit][Statu ...
- [BZOJ2730][HNOI2012]矿场搭建 点双 割点
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2852 Solved: 1344[Submit][Stat ...
- BZOJ2730 [HNOI2012]矿场搭建 - Tarjan割点
Solution 输入中没有出现过的矿场点是不用考虑的, 所以不用考虑只有 一个点 的点双联通分量. 要使某个挖矿点倒塌, 相当于割去这个点, 所以我们求一遍割点和点双联通分量. 之后的点双联通分量构 ...
- BZOJ2730: [HNOI2012]矿场搭建
传送门 图的连通性相关的必和割点割边之类的有关. 题目要求对于一个无向图,任意一点被删除后,所有点都和某些指定点是联通的. 这道题比较简单的做法就是求出来所有的块.对于一个块,如果块里有两个及两个以上 ...
- [BZOJ2730][HNOI2012]矿场搭建(求割点)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...
- 【双连通分量】Bzoj2730 HNOI2012 矿场搭建
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- BZOJ2730:[HNOI2012]矿场搭建(双连通分量)
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- BZOJ2730 [HNOI2012]矿场搭建[点双连通分量]
看到删去一个点,需要剩下的都和关键点连通,有端联想到找点双,因为他怎么删点都是连通的. 对于一个孤立的点双,至少要设两个关键点. 如果两个点双以一个割点连接,假设断掉这个割点,两个块至少要各设一个关键 ...
- [BZOJ2730]:[HNOI2012]矿场搭建(塔尖)
题目传送门 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个 ...
随机推荐
- const 和 readonly 修饰符的用法
1. 只有C#内置类型(int,double,long等)可以声明为const;结果.类和数组不能声明为const. 2. readonly 是在字段上使用的修饰符,直接以类名.字段访问. 3. co ...
- css014 响应式web设计
css014 响应式web设计 一. 响应式web设计基础知识 1.rwd的三大理念:a.用于布局的弹性网络, b.用于图片和视频的弹性媒体,c.为不同屏幕宽度创建的不同样式的css媒体查询. ...
- css003 选择器:明确设置哪些样式
css003 选择器:明确设置哪些样式 1.每个样式的两个部分:选择器和声明块 1.标签选择器:整体控制 2.类选择器:精确控制(.+字母.数字.连字符或下划线) Css允许的类名为.+字母.数字.连 ...
- 如果将CTE 用在属于批处理的一部分的语句中
declare @s nvarchar(3) set @s = 'C%' ; -- 必须加分号with t_tree as ( select CountryRegionCode from person ...
- Redis-cluster集群【第三篇】:redis主从
Redis主从复制原理: 通过把这个RDB文件或AOF文件传给slave服务器,slave服务器重新加载RDB文件,来实现复制的功能! 复制的话:主服务器可以有多个从服务器!!! 不仅这样从服务器还 ...
- IIS站点无法访问..点浏览IIS窗口直接关掉
呃..其实这个问题很简单.. 大家可以先看这位大婶写的博文.. http://blog.csdn.net/chenguang79/article/details/7220232 如果网站一访问IIS就 ...
- Idea修改js和jsp不用重启
- layoutSubviews方法需要被调用的情况有哪些
layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写 layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews 但是是用i ...
- 使用code标签获得类似代码段的效果
几乎所有的浏览器都支持 code标签 code标签, 顾名思义,就是代码标签, imply tell browser, that 后面的部分是表示计算机代码. 因此, 浏览器可以根据自己的特点来显示这 ...
- shell学习之路:流程控制(while)
while循环: 介绍:while循环是不定循环,也称作条件循环.只要条件判断成立,循环就会一直继续执行,直到条件判断不成立,循环才会停止,这就是和for的固定循环不太一样了. while [ 条件判 ...