[BZOJ 2730][HNOI 2012] 矿场搭建
2730: [HNOI2012]矿场搭建
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 2113 Solved: 979
[Submit][Status][Discuss]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
0Sample Output
Case 1: 2 4
Case 2: 4 1HINT
Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);Case 2 的一组解为(4,5,6,7)。
题意
给定一个无向图, 分配最少的救援通道使任意一个结点断开后所有其余结点都与至少一个救援通道连通.
题解
断开一个点还能保持连通...除了点双联通分量还有谁?
每个点双连通分量里都至少要有一个并且为了保证最少只能有一个. 由于每个双联通分量中任选一个安置救援通道即可, 所以最终的方案数为各双联通分量的大小之积.
$Tarjan$ 求割顶然后乱搞也可以过.
参考代码
#include <cstdio>
#include <cstring>
#include <queue> const int MAXN=;
typedef long long LL; struct Edge{
int to;
Edge* next;
};
Edge E[MAXN];
Edge* head[MAXN];
Edge* top=E; int n,m,len,rt,son,ans,cnt,tot,Node,Case=,Time,dfn[MAXN],low[MAXN],vis[MAXN];
LL f; bool exist[MAXN],Gd[MAXN]; void DFS(int);
void Tarjan(int);
void Initialize();
void Insert(int,int);
int main()
{
while(scanf("%d",&m)==){
if(m==)
break;
Initialize();
for(int i=;i<=m;i++){
if(exist[i] && !dfn[i]){
rt=i;
son=;
Tarjan(i);
if(son> && !Gd[i])
Gd[i]=true;
}
}
for(int i=;i<=m+;i++){
if(!exist[i])
continue;
if(!Gd[i]){
cnt=;
Node=;
tot++;
DFS(i);
if(!cnt){
ans+=;
f=f*Node*1ll*(Node-)/;
}
else if(cnt==){
ans++;
f=Node*1ll*f;
}
}
}
printf("Case %d: %d %lld\n",Case,ans,f);
}
return ;
} void Initialize(){
int x,y;
memset(head,,sizeof head);
memset(exist,,sizeof exist);
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
memset(Gd,,sizeof Gd);
n=;
len=;
Time=;
rt=-;
f=1ll;
ans=;
Case++; for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
if(!exist[x]){
exist[x]=;
n++;
}
if(!exist[y]){
exist[y]=;
n++;
}
Insert(x,y);
Insert(y,x);
}
} void DFS(int x){
exist[x]=false;
for(Edge* i=head[x];i!=NULL;i=i->next){
if(!exist[i->to])
continue;
if(Gd[i->to] && vis[i->to]!=tot){
vis[i->to]=tot;
cnt++;
}
else if(!Gd[i->to]){
Node++;
DFS(i->to);
}
}
} void Tarjan(int x){
low[x]=dfn[x]=++Time;
for(Edge* i=head[x];i!=NULL;i=i->next){
if(!dfn[i->to]){
Tarjan(i->to);
if(x==rt)
son++;
else{
low[x]=std::min(low[x],low[i->to]);
if(low[i->to]>=dfn[x] && !Gd[x])
Gd[x]=true;
}
}
else low[x]=std::min(low[x],dfn[i->to]);
}
} void Insert(int from,int to){
top->to=to;
top->next=head[from];
head[from]=top;
top++;
}
Backup

[BZOJ 2730][HNOI 2012] 矿场搭建的更多相关文章
- BZOJ 2730:[HNOI2012]矿场搭建(割点+连通块)
[HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...
- 【BZOJ 2730】 [HNOI2012]矿场搭建
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- HNOI 2012 矿场搭建
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #def ...
- BZOJ 2733 HNOI 2012 永无乡 平衡树启示式合并
题目大意:有一些岛屿,一開始由一些无向边连接. 后来也有不断的无向边增加,每个岛屿有个一独一无二的重要度,问随意时刻的与一个岛屿联通的全部岛中重要度第k大的岛的编号是什么. 思路:首先连通性一定要用并 ...
- 【BZOJ】【2730】【HNOI2012】矿场搭建
Tarjan求BCC/割点 然而似乎我一开始抄的白书的板子哪里抄错了?还是本身哪里不对……(可能是不适用于这道题?因为这题要求求出每个BCC的大小..? 膜拜了ydc的写法= = 其实两次dfs也并没 ...
- BZOJ 2730: [HNOI2012]矿场搭建( tarjan )
先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...
- 【刷题】BZOJ 2730 [HNOI2012]矿场搭建
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3230 Solved: 1540[Submit][Stat ...
- 【BZOJ-2730】矿场搭建 Tarjan 双连通分量
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1602 Solved: 751[Submit][Statu ...
随机推荐
- 如何用webgl(three.js)搭建不规则建筑模型,客流量热力图模拟
本节课主要讲解如何用webgl(three.js)搭建一个建筑模型,客流量热力图模拟 使用技术说明: 这里主要用到了three.js,echart.js以及一些其它的js 与css技术,利用webso ...
- 存储过程中拼写sql并执行
直接上代码吧,根据不同的条件拼写sql后并执行 ALTER PROCEDURE [dbo].[usp_Statistic_WJB_DZSK_ZT] ( @year int, @half int,--0 ...
- Linux下如何查看版本信息(转)
Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.# uname -a (Linux查看版本当前操作系统内核信息) L ...
- JQuery ajax-向服务器发送请求的方法
如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法: xmlhttp.open("GET","ajax_info ...
- [转]a-mongodb-tutorial-using-c-and-asp-net-mvc
本文转自:http://www.joe-stevens.com/2011/10/02/a-mongodb-tutorial-using-c-and-asp-net-mvc/ In this post ...
- 阿里巴巴Java开发规约插件使用
10月14日上午9:00 阿里巴巴于在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发手册>扫描插件,该插件在扫描代码后,将不符合<手册>的代码按Bl ...
- 方法执行一次js
var isFirst = true; $(function () { //一级 $("#City").change(function () { var url = "/ ...
- jvm工具及命令大全
虚拟机栈 栈桢大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k 堆 -Xms:堆的最小值: -Xmx:堆的最大值: -Xmn:新生代的大小: -XX:NewSize:新生代最小值: ...
- C# 注释&SQL注释
SQL注释: 1.单行注释:--单行注释 2.多行注释:/*多行 注释*/ C#注释: 1.单行注释://单行注释 2.多行注释:/*多行 注释*/ 3.说明注释:///<summary> ...
- laravel开发之-网站初建
1 cmd 打开电脑命令窗口 2 目录切换到网站根目录 3 输入命令:php artisan serve 4 model 生成命令:php artisan make:model 需要生成的model名 ...