[HNOI2012]矿场搭建 题解
[HNOI2012]矿场搭建
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入
输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。
输出
输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。
样例输入
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
样例输出
Case 1: 2 4
Case 2: 4 1
提示
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
struct ro{
int to,next;
}road[];
int zz,a[];
void build(int x,int y){
zz++;
road[zz].to=y;
road[zz].next=a[x];
a[x]=zz;
}
int v[],zz2,dfn[],low[];
void tar(int x,int root){
zz2++;
v[x]=;
dfn[x]=low[x]=zz2;
for(int i=a[x];i>;i=road[i].next)
{
int y=road[i].to;
if(!v[y])
{
tar(y,root);
low[x]=min(low[x],low[y]);
if(dfn[x]<=low[y])
{
v[x]++;
}
}
else
{
low[x]=min(low[x],dfn[y]);
}
}
if((x==root&&v[x]>)||(x!=root&&v[x]>))
{
v[x]=;
}
else
v[x]=; }
int m,top,st[],bj,jj,size,zzzz;
bool rz[],rz2[];
void work(int x){
zz2++;
dfn[x]=low[x]=zz2;
rz[x]=rz2[x]=;
top++;
st[top]=x;
for(int i=a[x];i>;i=road[i].next)
{
int y=road[i].to;
if(v[y]==)
{
if(!bj)
{
bj=y;
jj=;
}
else if(bj!=y) jj=;
continue;
}
if(!rz2[y])
{
work(y);
low[x]=min(low[x],low[y]);
}
else if(rz[y])
{
low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x])
{
int v;
zzzz++;
do{
v=st[top];
top--;
size++;
}while(dfn[v]!=low[v]);
}
}
int n;
int main(){
// freopen("bzoj_2730.in","r",stdin);
// freopen("bzoj_2730.out","w",stdout);
int js=;
while(~scanf("%d",&m))
{
if(m==) break;
js++;
zz=;
memset(a,,sizeof(a));
n=;
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
build(x,y);
build(y,x);
n=max(n,max(x,y));
}
memset(v,,sizeof(v));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
zz2=;
for(int i=;i<=n;i++)
{
if(!v[i])
{
zz2=;
tar(i,i);
}
}
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
zz2=;
memset(rz,,sizeof(rz));
memset(rz2,,sizeof(rz2));
long long an=,ans=;
top=;
memset(st,,sizeof(st));
for(int i=;i<=n;i++)
{
if(!rz2[i]&&v[i]!=)
{
jj=;
bj=;
size=;
work(i);
if(!jj)
{
an+=;
if(size!=) ans*=(size*(size-))/;
}
else if(jj==)
{
an++;
ans*=size;
}
}
}
printf("Case %d: %lld %lld\n",js,an,ans);
}
//while(1);
return ;
}
[HNOI2012]矿场搭建 题解的更多相关文章
- BZOJ2730:[HNOI2012]矿场搭建——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2730 https://www.luogu.org/problemnew/show/P3225 听说 ...
- P3225 [HNOI2012]矿场搭建 题解
这道题挺难的,可以加深对割点的理解,还有,排列组合好重要了,分连通块,然后乘法原理(加法原理计数什么的) 传送门 https://www.luogu.org/problem/P3225 省选oi题 ...
- 【BZOJ2730】[HNOI2012]矿场搭建 Tarjan
[BZOJ2730][HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处. ...
- [HNOI2012]矿场搭建(割点)
[HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出 ...
- bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1147 Solved: 528[Submit][Statu ...
- BZOJ 2730: [HNOI2012]矿场搭建( tarjan )
先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3230 Solved: 1540[Submit][Stat ...
- Tarjan 点双+割点+DFS【洛谷P3225】 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- 【全面解禁!真正的Expression Blend实战开发技巧】第三章 从最常用ButtonStyle开始 - TextButton
原文:[全面解禁!真正的Expression Blend实战开发技巧]第三章 从最常用ButtonStyle开始 - TextButton 在实际项目中,使用blend做的最多的一定是各种自定义But ...
- oracle延迟块清除
oracle在执行一些DML操作时,会在block上有活动事务的标志,如果一个事务commit后,由于某些block在commit之前已经写回datafile, 或者事务影响到的block数过多,则c ...
- JS获取a标签的Href 内容
<script type="text/javascript">function getHref(obj){ alert(obj.href);} </script& ...
- cairo 图形库
简介 提到cairo,估计很少知道这还是一个图形库的名字(http://cairographics.org),Linux的两大流行桌面环境KDE和Gnome,其对应的基础组件是QT和GTK+,相对于框 ...
- ToolBarTray与ToolBarPanel的区别
ToolBarTray 类:表示处理ToolBar 的布局的容器.用于ToolBar控件模板之中. e.g. <ToolBarTray> <ToolBar> <Butto ...
- 我怎么忽略了身份框架魔法,只是使用OWIN验证的中间件,以获得要求我寻求什么呢?
该OWIN中间件的东西第三方登录集成到您的ASP.NET应用程序是非常酷的,但我似乎无法弄清楚如何就剜出来的新的ID,它取代了蹩脚的成员身份 API.我没有兴趣在坚持所产生的债权,并在英法为基础的数据 ...
- .NET重思(一)sealed和interface
博主这几天正好闲着,砸砸基础,毕竟自学,基础不牢靠很致命,要踏实啊~~~ 1.sealed关键字修饰一个类,也可以修饰实现方法或者属性.当sealed用于修饰一个类时,这个类不可以被继承,因此,这个类 ...
- autotools工具使用 good
学习GNU/LINUX开发的编程人员,上手之后不久就会在编译开源软件的时候碰到configure脚本,过段时间还会知道configure脚本是 autoconf生成的:但是真正想用起来autoconf ...
- OpenGL与Directx的区别
OpenGL 只是图形函数库. DirectX 包含图形, 声音, 输入, 网络等模块. 单就图形而论, DirectX 的图形库性能不如 OpenGL OpenGL稳定,可跨平台使用.但 OpenG ...
- iOS密码框实现(二)取消确定按钮
由于将确定按钮去掉了,所以需要重新修改下代码,当输入第四个数字时,自动进入房间. iOS 密码框效果图: 实现方式: 首先声明一个block初始化方法,因为这只是个框框,并不需要处理网 ...