BZOJ2730:[HNOI2012]矿场搭建(双连通分量)
Description
Input
输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。
Output
输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。
Sample Input
1 3
4 1
3 5
1 2
2 6
1 5
6 3
1 6
3 2
6
1 2
1 3
2 4
2 5
3 6
3 7
0
Sample Output
Case 2: 4 1
HINT
Solution
既然要炸肯定要炸割点,炸非割点是无法产生影响的,我们我们只考虑割点。
将原图中的割点去掉,得到的新图会是若干个连通块
若一个连通块靠近两个割点,那么这个连通块上是不需要建立的,因为炸了一个割点可以往另一个跑
若一个连通块只靠近一个割点,那么这个连通块必须建一个,不然炸了这个唯一的割点岂不是就GG了
注意考虑没有割点的情况,这种情况只需要随便建立两个即可。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N (1001)
using namespace std; struct Edge{int from,to,next;}edge[N<<];
int head[N],num_edge;
int Dfn[N],Low[N],dfs_num;
int n,Cut[N],a[N],cnt,u,v,vis[N];
int cut_num,size,case_num,num;
long long ans1,ans2; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].from=u;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Tarjan(int x,int fa)
{
long long son_num=,sum=;
Dfn[x]=Low[x]=++dfs_num;
for (int i=head[x]; i; i=edge[i].next)
if (!Dfn[edge[i].to])
{
son_num++;
Tarjan(edge[i].to,x);
Low[x]=min(Low[x],Low[edge[i].to]);
if (Low[edge[i].to]>=Dfn[x]) Cut[x]=true,cut_num++;
}
else if (Dfn[x]>Dfn[edge[i].to] && edge[i].to!=fa)
Low[x]=min(Low[x],Dfn[edge[i].to]);
if (fa== && son_num==)
Cut[x]=false,cut_num--;
} void Dfs(int x)
{
vis[x]=true;
if (Cut[x]){num++; return;}
size++;
for (int i=head[x]; i; i=edge[i].next)
if (!vis[edge[i].to])
Dfs(edge[i].to);
} int main()
{
scanf("%d",&n);
while (n!=)
{
memset(edge,,sizeof(edge)); memset(Dfn,,sizeof(Dfn));
memset(head,,sizeof(head)); memset(Low,,sizeof(Low));
memset(Cut,,sizeof(Cut)); memset(vis,,sizeof(vis));
num_edge=; cnt=; dfs_num=; cut_num=; for (int i=; i<=n; ++i)
{
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
a[++cnt]=u; a[++cnt]=v;
}
sort(a+,a+cnt+);
n=unique(a+,a+cnt+)-a-; for (int i=; i<=n; ++i)
if (!Dfn[a[i]])
Tarjan(a[i],); if (cut_num==)
{
case_num++;
printf("Case %d: 2 %lld\n",case_num,(long long)n*(n-)/);
scanf("%d",&n);
continue;
}
ans1=,ans2=;
for (int i=; i<=n; ++i)
if (!vis[a[i]] && !Cut[a[i]])
{
num=; size=;
Dfs(a[i]);
for (int j=; j<=n; ++j)
if (Cut[j])
vis[j]=false;
if (num>) continue;
ans1++; ans2*=size;
}
case_num++;
printf("Case %d: %lld %lld\n",case_num,ans1,ans2);
scanf("%d",&n);
}
}
BZOJ2730:[HNOI2012]矿场搭建(双连通分量)的更多相关文章
- [BZOJ2730][HNOI2012]矿场搭建 点双 割点
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2852 Solved: 1344[Submit][Stat ...
- bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1147 Solved: 528[Submit][Statu ...
- 【双连通分量】Bzoj2730 HNOI2012 矿场搭建
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- 洛谷 - P3225 - 矿场搭建 - 双连通分量
https://www.luogu.org/problem/P3225 这个东西有点绕. 最平凡的情况,整个原图只有一个点,那么它坍塌了之后就没有点了,不需要进行任何逃生.否则,当一个点坍塌之后,每个 ...
- BZOJ2730 [HNOI2012]矿场搭建[点双连通分量]
看到删去一个点,需要剩下的都和关键点连通,有端联想到找点双,因为他怎么删点都是连通的. 对于一个孤立的点双,至少要设两个关键点. 如果两个点双以一个割点连接,假设断掉这个割点,两个块至少要各设一个关键 ...
- BZOJ2730——[HNOI2012]矿场搭建
bzoj2730 & world final 2011 H 1.题目大意:就是有一个无向图,让你在里面选择点,使得,无论哪个点没了以后,其他的点都能到达你选择的任何一个点,输出最少 选择几个点 ...
- BZOJ2730 [HNOI2012]矿场搭建 - Tarjan割点
Solution 输入中没有出现过的矿场点是不用考虑的, 所以不用考虑只有 一个点 的点双联通分量. 要使某个挖矿点倒塌, 相当于割去这个点, 所以我们求一遍割点和点双联通分量. 之后的点双联通分量构 ...
- BZOJ2730: [HNOI2012]矿场搭建
传送门 图的连通性相关的必和割点割边之类的有关. 题目要求对于一个无向图,任意一点被删除后,所有点都和某些指定点是联通的. 这道题比较简单的做法就是求出来所有的块.对于一个块,如果块里有两个及两个以上 ...
- [BZOJ2730][HNOI2012]矿场搭建(求割点)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...
随机推荐
- js 替换中间四位手机号为 *
replace(/(\d{})\d{}(\d{})/, '$1****$2')
- rancher2.X搭建k8s集群平台
一, 新版特性 Rancher 1.6支持多种容器编排框架,包括Kubernetes.Mesos.Docker Swarm,默认的基础编排引擎是Cattle,Cattle极简的操作体验受到了大量开源社 ...
- 第十三章:基于socket.io实现即时通信
安装好环境,请参考ionic环境搭建之windows篇 和 ionic环境搭建之OS X篇 . 服务器端的搭建参考socket io官网,里面有非常详细的描述,按照步骤下来,最终可以在localhos ...
- hadoop-2.6.0.tar.gz + spark-1.6.1-bin-hadoop2.6.tgz的集群搭建(单节点)(CentOS系统)
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- C++程序设计基础(1)程序的编译和执行
注:读<程序员面试笔记>笔记总结 1.编译执行过程 1.1预处理: (1)所有以#开头的代码都属于预处理的范畴:#include,#define,#ifdef(#ifndef,#endif ...
- 【linux相识相知】sed命令
在之前的博客中我们介绍了文本三剑客中grep,本次博客就另外一名剑客——sed做出详细的描述,sed真的是一款强大的工具.下面让我们来一起看一下吧! 概述和工作机制 SED的英文全称为Stream E ...
- 远程SQL Server连接不上
运行 cmd -> 输入 netsh winsock reset重启后 应该可以连接sql了
- 1.zookeeper的安装
1.解压zk压缩包 tar -zxvf (zk压缩包路径名) -C (解压目标目录路径) 2.在zk解压目录下新建data文件夹 mkdir data 3.在data文件夹下新建myid vi myi ...
- owin解决跨域js请求
最近在用owin打了一个建议的http的api服务,但遇到了js跨域访问的问题,后来在网上找到了答案,已帮助遇到此问题的人 1.首先nuget先按着owin依赖的包,然后至关重要的一步是引用Micro ...
- PAT 1066 Root of AVL Tree
#include <cstdio> #include <cstdlib> class Node { public: Node* L; Node* R; int height; ...