[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 ...
随机推荐
- 09 jdk1.5的并发容器:CopyOnWriteArrayList(转载)
原文链接:http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略. 其基本思路是,从一开始大家都在共享同一个内容 ...
- java当中的定时器
对于开发游戏项目的同胞来说,Timer 这个东西肯定不会陌生,今天对以前自己经常使用的定时进行了一番小小的总结!没有写具体实现的原理,只是列举出了其中的四种比较常见的使用方法,相对而言,所以只要按照其 ...
- Object的原型拷贝-create、assign、getPrototypeOf 方法的结合
一.实现原型拷贝 1.1.代码 tips:为了体现原型链,写了继承实现的代码,这部分可跳过- <script> /* 创建包含原型链的实验对象obj1-- start */ ...
- pureMVC与strangeIoc框架对比
前言 最近有机会了解到了StrangeIoc框架,就拿来跟自己比较熟悉的pureMVC进行一下简要的对比.这两套开源框架都是基于MVC模式的扩展,pureMVC是一个跨平台跨语言的MVC轻量级应用框架 ...
- 如何把连接字符串放到App.cfg配置文件中
首先主Windows程序要添加一个[应用程序配置文件]会在项目中生成一个App.config文件. 在项目中也引用System.Configuration这个引用 当前文档中没有源. 在后台数据类库中 ...
- Menustrip控件和ContextMenustrip控件
Menustrip 控件是由System.Windows.Forms.Menustrip类提供,取代了以前的MainMenu控件,是应用程序菜单结构的容器,在建立菜单时,要给Menustrip控件添加 ...
- [javaSE] IO流(管道流)
之前我们使用io流,都是需要一个中间数组,管道流可以直接输入流对接输出流,一般和多线程配合使用,当读取流中没数据时会阻塞当前的线程,对其他线程没有影响 定义一个类Read实现Runable接口,实现r ...
- mysql数据同步
随着各行业信息化水平的不断提升,各种各样的信息管理系统都被广泛使用,各系统间数据完全独立,形成了大量的信息孤岛.出于管理及决策方面的需求,实现各平台的数据同步是一个很迫切的需求,TreeSoft数据库 ...
- docker 安装PIL python 报错 IOError: decoder zip not available
按照网上得方法:安装依赖库:yum install freetype freetype-develyum install libjpeg libjpeg-develyum install zlib z ...
- MvcForum作者称该项目进入缓慢更新
MvcForum作者在github上发表 This project is no longer actively developed as I don't have the time. As and w ...