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. flask综合整理1

    前言: 框架的对比 Django:1个重武器,包含了web开发中常用的功能.组件的框架:(ORM.Session.Form.Admin.分页.中间件.信号.缓存.ContenType....): To ...

  2. bootstrap框架的使用

    1.默认修改input输入框激活的颜色(充电桩) .form-control:focus, .ms-choice:focus, input[type=text]:focus, input[type=p ...

  3. java里面的package/import 和PHP里面的namespace/use 是一模一样的吗

    java里面的package/import 和PHP里面的namespace/use 是一模一样的吗? java: php package mypage; namespace mypage; impo ...

  4. vs文件属性(生成操作)各选项功能

    右击项目里的文件,选择属性(F4)会有[生成操作]的选项. 它提供了14项选择,如图: 在这说一下常用的选项: 1.编译 编译用于c#代码类的操作,编译之后输出在该程序集的bin目录下.换句话说,代码 ...

  5. libtar 和 libz 的使用

    libtar 和 libz 的使用 用c代码生成 tar.gz 文件  实现的功能和 tar -zcf 命令一样 大概流程为 1.先用libtar相关函数对某个目录生成tar文件 2.然后对tar文件 ...

  6. XML再深入

    XML 命名空间 XML 命名空间提供避免元素命名冲突的方法. 使用前缀来避免命名冲突 在 XML 中的命名冲突可以通过使用名称前缀从而容易地避免. 该 XML 携带某个 HTML 表格和某件家具的信 ...

  7. jqueryUI学习

    01.选项卡 拖动按钮<div id="tabs"> <ul> <li><a href="#tabs-1">第一 ...

  8. 一个基于Ionic3.x cordova的移动APP demo

    项目地址如遇网络不佳,请移步国内镜像加速节点 前端技术: Angular4.x + ionic3.x + cordova 项目运行: git clone git@github.com:EasyTuan ...

  9. 阿里云 linux 系统的架构

    简单说,/lib是内核级的,/usr/lib是系统级的,/usr/local/lib是用户级的. /lib/ — 包含许多被 /bin/ 和 /sbin/ 中的程序使用的库文件.目录 /usr/lib ...

  10. 我为什么不用Django而用Flask?

    前言 对于初学者来说,找到一个好的框架来学习或者项目开发都是非常有必要的,而当你有一定开发经验后,你应该选择适合当前业务需要的框架.我这里并不想探讨哪个框架好哪个不好,这个永恒的话题就跟探讨“世界上哪 ...