【洛谷P3225】[HNOI2012]矿场搭建
矿场搭建
根据题意,发生事故时会有一个挖煤点坍塌,
只有当这个点是割点,会对图的连通性产生影响,
我们首先Tarjan一遍找到所有割点,将原图除去这些割点后,
遍历一遍,找出所有连通块,分三种情况讨论:
1、该连通块连接着两个及以上的割点,这时如果有一个割点被摧毁,
还可以从另一个割点到达其他连通块,不需要建逃生通道
2、该连通块连接着一个割点,若这个割点被摧毁,该连通块的人就无法逃生,
必须建一个出口(从该连通块的所有节点中选一个,ans*=size)
3、该连通块没有割点相连,要建两个出口,如果其中一个被摧毁,还可以从另一个逃出去
ans*=C(size,2);
#include<algorithm>
#include<cstdio>
#define reset(a) std::fill(a,a+1+n,0)
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define N 50020
int n,m,dfn[N],low[N],vis[N],tot,k,T;
const int ch_top=4e7+;
char ch[ch_top],*now_r=ch-,*now_w=ch-;
inline int read(){
while(*++now_r<'');
register int x=*now_r-'';
while(*++now_r>='')x=x*+*now_r-'';
return x;
}
long long ans;
bool gd[N];
int Head[N],to[N<<],next[N<<],num;
void Tarjan(int u){
dfn[u]=low[u]=++tot;
int cnt=;
for(int i=Head[u];i;i=next[i]){
int v=to[i];
if(!dfn[v]){
Tarjan(v); cnt++;
low[u]=min(low[u],low[v]);
if((u==&&cnt>)||(u!=&&low[v]>=dfn[u]))
gd[u]=;
}
else low[u]=min(low[u],dfn[v]);
}
}
int dfs(int t){
int sz=; vis[t]=;
for(int i=Head[t];i;i=next[i])
if(!vis[to[i]]&&!gd[to[i]])
sz+=dfs(to[i]);
else if(vis[to[i]]!=T&&gd[to[i]]){
k++; vis[to[i]]=T;
}
return sz;
}
int main()
{
fread(ch,,ch_top,stdin);
int now=;
m=read();
while(m){
if(!m) break;
reset(Head); reset(gd);
reset(vis); reset(dfn);
num=tot=n=T=;
int x,y;
for(int i=;i<=m;i++){
x=read(); y=read();
to[++num]=y;
next[num]=Head[x];
Head[x]=num;
to[++num]=x;
next[num]=Head[y];
Head[y]=num;
n=max(n,max(x,y));
}
int cnt=;
Tarjan();ans=;
for(int i=;i<=n;i++)
if(!gd[i]&&!vis[i]){
k=; T++;
int size=dfs(i);
if(k==) ans*=(long long)size*(size-)/,cnt+=;
else if(k==) ans*=size,cnt++;
}
printf("Case %d: %d %lld\n",++now,cnt,ans);
m=read();
}
return ;
}
双倍经验:UVA1108
【洛谷P3225】[HNOI2012]矿场搭建的更多相关文章
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 洛谷——P3225 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 洛谷P3225 HNOI2012 矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
- 洛谷 P3225 [HNOI2012]矿场搭建
传送门 题目大意:建设几个出口,使得图上无论哪个点被破坏,都可以与出口联通. 题解:tarjian求割点 首先出口不能建在割点上,找出割点,图就被分成了几个联通块. 每个联通块,建出口.如果割点数为0 ...
- 洛谷—— P3225 [HNOI2012]矿场搭建
https://www.luogu.org/problem/show?pid=3225 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有 ...
- BZOJ2730或洛谷3225 [HNOI2012]矿场搭建
BZOJ原题链接 洛谷原题链接 显然在一个点双连通分量里,无论是哪一个挖煤点倒塌,其余挖煤点就可以互相到达,而对于一个点双连通分量来说,与外界的联系全看割点,所以我们先用\(tarjan\)求出点双连 ...
- P3225 [HNOI2012]矿场搭建 割点 tarjan 双联通分量
https://www.luogu.org/problemnew/show/P3225 题意 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条 ...
- P3225 [HNOI2012]矿场搭建 题解
这道题挺难的,可以加深对割点的理解,还有,排列组合好重要了,分连通块,然后乘法原理(加法原理计数什么的) 传送门 https://www.luogu.org/problem/P3225 省选oi题 ...
- P3225 [HNOI2012]矿场搭建
传送门 对于一个点双联通分量,如果它连接了两个或更多割点 那么不论哪个点GG都有至少一条路通到其他的点双联通分量,所以我们不用考虑 如果它只连接一个割点,如果这个割点GG,那整个块也一起GG,所以要再 ...
- [Luogu] P3225 [HNOI2012]矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
随机推荐
- (转)linux shell单引号、双引号及无引号区别
原文:http://blog.csdn.net/woshizhangliang999/article/details/50132265 3.描述linux shell中单引号.双引号及不加引号的简单区 ...
- Oracle 基础系列之1.2 oracle的基本使用
在1.1的安装过程完成之后,进入第二部分,oracle的基本使用,在使用前,首先测试下,oracle是否安装成功,以及检查oracle的关键服务时候开启 1.首先测试下,oracle是否安装成功 打开 ...
- 案例46-crm练习客户登录
1 login.jsp代码 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 几个免费 IP 归属地查询 API
1.淘宝:同个IP不能连续查询,需要时间间隔 http://ip.taobao.com/service/getIpInfo.php?ip=114.114.114.114 返回结果 { "co ...
- C语言中extern的用法--转
http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的, ...
- git本地分支关联远程分支
问题描述: 从远程master克隆下来以后, 在本地创建wf_dev分支, 此时执行git pull 操作出现图中问题. 这是因为:本地的wf_dev分支还没有和远程的wf_dev进行关联. 执行: ...
- Mysql性能调优方法
第一种方法 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的 性能,我们可以将表中字 ...
- C#学习笔记11
1.List.BinarySearch():BinarySearch()采用的是二分搜索算法,要求元素已经排好序,其特点是假如元素没有找到,会返回一个负整数,该值的按位取反(~)结果是“大于被查找元素 ...
- js之变量介绍
变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var x = 'He ...
- swagger快速开发
转载:https://blog.csdn.net/xxoo00xx00/article/details/77163399 swagger 学习笔记 搭建环境: 1,jdk1.8 2,idea 3,sp ...