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

9
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 1: 2 4
Case 2: 4 1

HINT

Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);
Case 2 的一组解为(4,5,6,7)。

Solution

首先我们先跑一遍tarjan将割点找出来。
既然要炸肯定要炸割点,炸非割点是无法产生影响的,我们我们只考虑割点。
将原图中的割点去掉,得到的新图会是若干个连通块
若一个连通块靠近两个割点,那么这个连通块上是不需要建立的,因为炸了一个割点可以往另一个跑
若一个连通块只靠近一个割点,那么这个连通块必须建一个,不然炸了这个唯一的割点岂不是就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]矿场搭建(双连通分量)的更多相关文章

  1. [BZOJ2730][HNOI2012]矿场搭建 点双 割点

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2852  Solved: 1344[Submit][Stat ...

  2. bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1147  Solved: 528[Submit][Statu ...

  3. 【双连通分量】Bzoj2730 HNOI2012 矿场搭建

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  4. 洛谷 - P3225 - 矿场搭建 - 双连通分量

    https://www.luogu.org/problem/P3225 这个东西有点绕. 最平凡的情况,整个原图只有一个点,那么它坍塌了之后就没有点了,不需要进行任何逃生.否则,当一个点坍塌之后,每个 ...

  5. BZOJ2730 [HNOI2012]矿场搭建[点双连通分量]

    看到删去一个点,需要剩下的都和关键点连通,有端联想到找点双,因为他怎么删点都是连通的. 对于一个孤立的点双,至少要设两个关键点. 如果两个点双以一个割点连接,假设断掉这个割点,两个块至少要各设一个关键 ...

  6. BZOJ2730——[HNOI2012]矿场搭建

    bzoj2730 & world final 2011 H 1.题目大意:就是有一个无向图,让你在里面选择点,使得,无论哪个点没了以后,其他的点都能到达你选择的任何一个点,输出最少 选择几个点 ...

  7. BZOJ2730 [HNOI2012]矿场搭建 - Tarjan割点

    Solution 输入中没有出现过的矿场点是不用考虑的, 所以不用考虑只有 一个点 的点双联通分量. 要使某个挖矿点倒塌, 相当于割去这个点, 所以我们求一遍割点和点双联通分量. 之后的点双联通分量构 ...

  8. BZOJ2730: [HNOI2012]矿场搭建

    传送门 图的连通性相关的必和割点割边之类的有关. 题目要求对于一个无向图,任意一点被删除后,所有点都和某些指定点是联通的. 这道题比较简单的做法就是求出来所有的块.对于一个块,如果块里有两个及两个以上 ...

  9. [BZOJ2730][HNOI2012]矿场搭建(求割点)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...

随机推荐

  1. IDEA查看第三方jar包的源代码时出现Decompiled.class file, bytecode version:52.0 (Java 8)的解决方案

    IDEA中使用Ctrl+左键查看第三方jar包的源代码时,出现Decompiled.class file, bytecode version:52.0 (Java 8),说明IDEA没找到该类的.ja ...

  2. vue组件(持续更新)

    1.vee-validate :vue的表单验证组件 网友博客介绍:https://www.cnblogs.com/xxwang/p/6104715.html

  3. UnityError The same field name is serialized multiple times in the class or its parent class. This is not supported: Base(MonoBehaviour) i

    相同的字段名在类或其父类中被多次序列化.这是不支持的, 这里指的是 变量i . 写如下两个脚本挂到新项目的相机上运行就会出现这个问题: public class Father : MonoBehavi ...

  4. vue中添加util公共方法&&ES6之import、export

    vue中添加util公共方法&&ES6之import.export https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Re ...

  5. mysql安装 2018最新安装mysql教程及遇到的问题解决Windows下

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8094659.html 今天因为换了个LINUX系统 把我的E盘不小心给卸载了 结果还是不能用 ...

  6. 机器学习——XGBoost

    基础概念 XGBoost(eXtreme Gradient Boosting)是GradientBoosting算法的一个优化的版本,针对传统GBDT算法做了很多细节改进,包括损失函数.正则化.切分点 ...

  7. Understanding Java 8 Streams API---reference

    http://java.amitph.com/2014/01/understanding-java-8-streams-api.html Since past few versions, Java h ...

  8. spring-boot 1.4.x遇到的cpu高的问题

    如果你的spring-boot应用里tomcat线程耗cpu较高,并主要耗在做读取jar的操作上(堆栈类似下面),可能跟我们遇到同样的问题. CRC32.update(byte[], int, int ...

  9. MVC5 model常见的写法

    1.数据库表中为ID的字段 [Key] //关键字 [Required] //不为空 [Display(Name = "ID")] public int id { get; set ...

  10. linux基础-linux和unix的区别

    有时候我们对天天使用的Linux指令,只知道怎么用,却分不清概念用法区别,我觉得很有必要整理整理大家熟视无睹的一些linux概念区别. 首先说说unix和linux的区别: linux和unix的最大 ...