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]矿场搭建(塔尖)
题目传送门 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个 ...
随机推荐
- Android之Proguard语法
-include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_pat ...
- IBatis 构建 In语句
语句 <select id="qryProjectsByIds" parameterClass="Hashtable" resultMap="p ...
- electron-Node.js Error: Module version mismatch. Expected
本来以为是nodejs的版本问题,后来才发现是electron用本地包的问题 Installing modules and rebuilding for Electron You can also c ...
- .Net中使用OracleDataAdapter
本来只想简单记录一下OracleDataAdapter的批量增加和修改用法的,在园子里看到一篇比较详细的就在这分享了(Oracle Data Provider for .NET),虽然用的是 Upda ...
- 网络广告术语CPC、CPM和CTR的含义和关系
1. CPC(Cost-per-click):对于广告主来说,就是每次点击(广告)的(付给网站主的)成本:对于媒体(或网站主)来说,就是用户每次点击(广告)(向广告主收取)的费用.可以用公 ...
- centos 7.0 ln命令 和chkconfig 命令介绍 开机自动启 服务
有时候centos需要 程序开机启动的时候 自启动 首先在 /etc/init.d/ cd /etc/init.d 文件夹下建立开机启动项 使用ln命令 使用方式 : ln [options] so ...
- VS2015新建asp.net core站点
摘要 电脑上安装了vs2015,今天就尝尝鲜,新建一个项目试试. BBS 使用vs2015新建一个解决方案,然后新建项目,此时你会发现没有asp.net core项目,这就需要先安装asp.net c ...
- [Exchange]使用EWS托管API2.0同步邮箱
你可以通过Exchange Web Serivice(EWS)托管API去检索从一个给定的时间点,文件夹中有变化的列表中的项. 客户端可以使用SyncFoldersItems方法,同步服务端的项目,你 ...
- linux 文件操作和权限
1.touch 创建文件 2.查看文件cat 浏览一个较短文件,行号加上cat -n 3.反向显示内容tac 并不支持-n选项 4.分页显示文件内容more 空格或f 翻页 回车换行 q或者Q退 ...
- 只允许wheel组到用户才能使用 su命令
su只是切换到root用户, 不改变当前目录: su - 切换到root和改变目录到/root 修改用户到组: usermod gpasswd wheel组相当于windows的 Administra ...