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
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)。

题意

给定一个无向图, 分配最少的救援通道使任意一个结点断开后所有其余结点都与至少一个救援通道连通.

题解

断开一个点还能保持连通...除了点双联通分量还有谁?

每个点双连通分量里都至少要有一个并且为了保证最少只能有一个. 由于每个双联通分量中任选一个安置救援通道即可, 所以最终的方案数为各双联通分量的大小之积.

$Tarjan$ 求割顶然后乱搞也可以过.

参考代码

GitHub

 #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] 矿场搭建的更多相关文章

  1. BZOJ 2730:[HNOI2012]矿场搭建(割点+连通块)

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

  2. 【BZOJ 2730】 [HNOI2012]矿场搭建

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

  3. HNOI 2012 矿场搭建

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #def ...

  4. BZOJ 2733 HNOI 2012 永无乡 平衡树启示式合并

    题目大意:有一些岛屿,一開始由一些无向边连接. 后来也有不断的无向边增加,每个岛屿有个一独一无二的重要度,问随意时刻的与一个岛屿联通的全部岛中重要度第k大的岛的编号是什么. 思路:首先连通性一定要用并 ...

  5. 【BZOJ】【2730】【HNOI2012】矿场搭建

    Tarjan求BCC/割点 然而似乎我一开始抄的白书的板子哪里抄错了?还是本身哪里不对……(可能是不适用于这道题?因为这题要求求出每个BCC的大小..? 膜拜了ydc的写法= = 其实两次dfs也并没 ...

  6. BZOJ 2730: [HNOI2012]矿场搭建( tarjan )

    先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...

  7. 【刷题】BZOJ 2730 [HNOI2012]矿场搭建

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

  8. 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】

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

  9. 【BZOJ-2730】矿场搭建 Tarjan 双连通分量

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

随机推荐

  1. [PY3]——IO——文件读写

    文件打开和关闭 # 使用open 打开文件,返回时值是一个 File-like对象 f.open('/test/file') # 使用read读取文件 f.read( ) # 使用close关闭文件 ...

  2. Tomcat源码分析——请求原理分析(下)

    前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...

  3. 使用 pjax 实现无刷新切换页面

    一.目的 1.当打开链接的时候,页面是淡入显示,并且页面顶部会显示加载进度条,页面显示完成时,进度条加载满并且消失. 2.点击页面上的 a 标签时,显示加载进度条,并且当前页面淡出消失,当前页面淡出消 ...

  4. Docker学习(二): 镜像的使用与构建

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  5. layui对json数据的格式要求

    layui有自己的一套特定的数据格式交互,必须参数code:0,msg:“”,count:数据size(int),data:”数据List”.**一般我们选择封装返回接收类**. 若想要绑定数据到la ...

  6. Bash on windows从14.0升级到ubuntu16.04

    升级参考:https://www.zhihu.com/question/49411626 解决中文乱码问题参考:http://www.lofter.com/tag/ubuntu%E5%AD%90%E7 ...

  7. 微服务系列(二):使用 API 网关构建微服务

    编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法. 作者介绍:Chris Richardso ...

  8. bnu 10783 格斗游戏 线段与圆的关系

    格斗游戏 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class name: ...

  9. VS2012 常用配置

    一. 整合svn版本控制 1. 点击此 下载与SVN版本相对应的ankhsvn插件,本人用的是Subversion 1.8 2. 安装ankhsvn插件,打开VS2012,右键任一工程,有显示如下图, ...

  10. Max Sum(经典DP)

    求最长总和序列,状态转移方程:dp[i] = max(dp[i-1]+a[i].a[i]) 因为可能有负数,所以要判断dp是否大于0,如果小于0则序列中断,从中断点开始 起始点可以用数组s保存,有中断 ...