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也并没 ...
随机推荐
- C#图解教程读书笔记(第2章 C#编程概述)
这章主要是一个对于C#程序的概括解释 和C/C++不同,不是用include声明引用的头文件,而是通过using的方式,声明引用的命名空间. 命名和C/C++类似,并且也是区分大小写的,这件事情在VB ...
- Windows环境双系统安装环境配置
(最惊喜的事情莫过于...在安装系统完成重新试图安装Docker时解决了关于HyperV的问题,结果提示Docker只能在Win10 Pro或者Enterprise环境下运行...我很坚强...可以按 ...
- Bootstrap Multiselect
Getting Started Link the Required Files First, the jQuery library needs to be included. Then Twitter ...
- aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用
引入 cglib-nodep-2.1_3.ja包 cglib产生的代理类是目标类的子类 定义接口,让切面都继承它,方便加入到动态代理方法 的那个类中使用 在SalaryInterceptor类中使用 ...
- LRU缓存算法与pylru
这篇写的略为纠结,算法原理.库都是现成的,我就调用了几个函数而已,这有啥好写的?不过想了想,还是可以介绍一下LRU算法的原理及简单的用法. LRU(Least Recently Used,最近最少 ...
- GPU CUDA之——深入理解threadIdx
http://blog.csdn.net/canhui_wang/article/details/51730264 摘要 本文主要讲述CUDA的threadIdx. 1. Grid,Block和Thr ...
- BZOJ1924:[SDOI2010]所驼门王的宝藏(强连通分量,拓扑排序)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- mxnet导入图像数据
图像的标签在一个json文件中. %matplotlib inline import json import gluonbook as gb import mxnet as mx from mxnet ...
- Linux学习总结(七)-磁盘管理 du df fdisk
一 命令df df,即disk free,可用来查看当前系统的挂载情况,也可以用来查看整体磁盘的使用情况df 不带参数,默认以KB单位显示df -i -----查看inodes 使用情况,要清楚理解i ...
- 第六章.MyBatis缓存结构
一级缓存 测试案例: MyBatisTest.java //缓存 @Test public void testFindCustomerCache1() throws Exception{ SqlSes ...