BZOJ2730_矿场搭建_KEY
这道题用Tarjan求出点-双连通分量,对联通块做一些玄学操作。
细节很多,不说了看code。
code:
/**************************************************************
Problem: 2730
User: yekehe
Language: C++
Result: Accepted
Time:0 ms
Memory:840 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int read()
{
char c;while(c=getchar(),c<''||c>'');
int x=c-'';while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x;
} int N; struct list{
int head[],nxt[],To[],cnt;
void clear(){memset(head,-,sizeof head);memset(nxt,-,sizeof nxt);cnt=;} void add(int x,int y)
{
To[cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
cnt++;
}
}W; int DFN[],LOW[],cnt,wif[];
void tarjan(int now,int fa)
{
int child=;
DFN[now]=LOW[now]=++cnt;
for(int i=W.head[now];i!=-;i=W.nxt[i]){
if(!DFN[W.To[i]]){
child++;
tarjan(W.To[i],now);
LOW[now]=min(LOW[now],LOW[W.To[i]]);
if(LOW[W.To[i]]>=DFN[now])wif[now]=;//割顶的判定
}
else if(DFN[W.To[i]]<DFN[now]&&W.To[i]!=fa){
LOW[now]=min(LOW[now],DFN[W.To[i]]);
}
}
if(fa<&&child==)wif[now]=;
}//求点-双连通分量 int ct=;
int vis[],tong[];
long long cnc;
void dfs(int now)
{
cnc++;//求除了割点的联通块内的其他点的数量
vis[now]=;//标记该点被访问
for(int i=W.head[now];i!=-;i=W.nxt[i]){
if(!vis[W.To[i]])
if(wif[W.To[i]])tong[W.To[i]]=ct;//用桶记录割顶
else dfs(W.To[i]);
}
} int main()
{
int TOT=;
while((N=read())!=){
TOT++;
W.clear();
memset(DFN,,sizeof DFN);
memset(LOW,,sizeof LOW);
memset(tong,,sizeof tong);
memset(wif,,sizeof wif);
memset(vis,,sizeof vis);
cnt=;
int TN=;
for(int i=;i<=N;i++){
int x=read(),y=read();
TN=max(TN,x);TN=max(TN,y);
W.add(x,y);W.add(y,x);//双向边
}
for(int i=;i<=TN;i++)
if(!DFN[i])tarjan(i,-);
int ans=;
printf("Case %d: ",TOT);
long long tot=;//方案数
for(int i=;i<=TN;i++)if(!vis[i]&&!wif[i]){//这个点既不是割顶也没被访问过
cnc=;//联通块内除了割顶的点的数量
dfs(i);
int kkk=;//求有几个割顶
for(int j=;j<=TN;j++)if(tong[j]==ct)kkk++;
if(!kkk){//如果这个联通块内没有割顶,那么要且只要建两个救助站就好了,可以自己画图
ans+=;
tot=tot*cnc*(cnc-)/;//用乘法原理和组合求方案数
}
else {
if(kkk==){//有一个割顶
ans++;
tot=tot*cnc;//乘以联通块内除了割顶的点的数量
}
}//当割顶的数量大于等于2时不能也不需要建救助站。不能是因为要求数量最少,可以自己画图
}
printf("%d %lld\n",ans,tot);
}
}
BZOJ2730_矿场搭建_KEY的更多相关文章
- 【BZOJ-2730】矿场搭建 Tarjan 双连通分量
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1602 Solved: 751[Submit][Statu ...
- 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就 ...
- bzoj2730(矿场搭建)
矿场搭建,不知道为什么,莫名其妙T了在212上,额,zyh数据真的坑. bzoj200轻松跑过啊. 就是点双联通分量缩点,然后标记割点,一个块如果有>=2个割点,则不需要挖矿洞, 如果只有一割点 ...
- 【CJOJ P1333】【HNOI2012】矿场搭建
[HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 【刷题】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】【HNOI2012】矿场搭建
Tarjan求BCC/割点 然而似乎我一开始抄的白书的板子哪里抄错了?还是本身哪里不对……(可能是不适用于这道题?因为这题要求求出每个BCC的大小..? 膜拜了ydc的写法= = 其实两次dfs也并没 ...
随机推荐
- 二、基于事件的异步编程模式(EAP)
一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进 ...
- [原]Linux 命令行 发送邮件
1.mail -s hi xx@yy.com 给xx@yy.com发一封主题为hi的信(没有正文) 编辑完内容后Ctrl-D结束. 2.echo "This is a test mail!& ...
- S/4HANA服务订单Service Order的批量创建
我工作中接到一个任务,需要在性能测试系统里创建一亿条服务订单service order来做性能测试. 这么大规模的数据量,当然只能用代码来创建了. 本文提到的所有ABAP代码,我均已上传到我的Gith ...
- hdu5194 DZY Loves Balls 【概率论 or 搜索】
//yy:那天考完概率论,上网无聊搜个期望可加性就搜到这题,看到以后特别有亲和感,挺有意思的. hdu5194 DZY Loves Balls [概率论 or 搜索] 题意: 一个盒子里有n个黑球和m ...
- php仿照asp实现application缓存的代码分享
php 怎么没有asp 那样的application缓存呢?最近我找了很多,都只有自己写,下面我分享一段代码 class php_cache{ //相对或者绝对目录,末尾不要加 '/' var $ca ...
- 小修改,让mvc的验证锦上添点花
首先,mvc的客户端验证用的是jquery.validate.js, jquery.validate本身已经提供了很好的扩展功能,通过简单点配置就可以做得更好看些. 而Microsoft通过jquer ...
- Keil开发的ARM程序main函数之前的汇编分析
Keil开发的ARM程序main函数之前的汇编分析 ——BIN文件中RW段的数据移动 系统平台: STM32系列STM32F103ZE,512KB内部FLASH,64KB片内存储; FLASH地址范围 ...
- Gradle Goodness: Working with Live Task Collection
Gradle support the definition of so called live collections. These collections are mostly created ba ...
- mysql获取正在运行的sql
select id,db,host,time,info,command from information_schema.processlist where command<>'sleep' ...
- TCP/IP初识(一)
TCP/IP学习记录,如有错误请指正,谢谢!!! 什么是TCP/IP协议? TCP/IP协议族分为四层(另一个名字是Internet协议族(Internet Protocol Suite)):链路层. ...