bzoj 2730: [HNOI2012]矿场搭建
#include<cstdio>
#include<cstring>
#include<iostream>
#define M 508
using namespace std;
int T=,m,n,head[M],K,next[*M],u[*M],cnt,f[M],c[M],fa[M],dfn[M],low[M],time1,ans,bi[M],sum[M];
long long ans1=;
void jia(int a1,int a2)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
}
void tarjin(int a1,int deep)
{
time1++;
dfn[a1]=low[a1]=time1;
c[a1]=-;
int tot=;
for(int i=head[a1];i;i=next[i])
if(u[i]!=fa[a1])
{
fa[u[i]]=a1;
if(!c[u[i]])
{
tarjin(u[i],deep+);
low[a1]=min(low[a1],low[u[i]]);
tot++;
if(deep==&&tot>)
f[a1]=;
if(deep>&&low[u[i]]>=dfn[a1])
f[a1]=;
}
else if(c[u[i]]==-&&u[i]!=fa[a1])
low[a1]=min(low[a1],dfn[u[i]]);
}
c[a1]=;
}
void dfs(int a1)
{
c[a1]=;
if(!bi[a1])
bi[a1]=time1;
else
bi[a1]=-;
for(int i=head[a1];i;i=next[i])
if(!c[u[i]]&&!f[u[i]])
dfs(u[i]);
return;
}
int main()
{
for(;scanf("%d",&m),m;T++){
ans=cnt=n=;
ans1=;
memset(head,,sizeof(head));
memset(bi,,sizeof(bi));
memset(f,,sizeof(f));
memset(sum,,sizeof(sum));
for(int i=;i<=m;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
n=max(n,a1);
n=max(n,a2);
jia(a1,a2);
jia(a2,a1);
}
time1=;
for(int i=;i<=n;i++)
{
f[i]=;
c[i]=;
fa[i]=;
}
tarjin(,);
time1=;
for(int i=;i<=n;i++)
if(f[i])
{
memset(c,,sizeof(c));
for(int j=head[i];j;j=next[j])
if(!c[u[j]]&&!f[u[j]])
{
time1++;
dfs(u[j]);
}
}
for(int i=;i<=n;i++)
if(bi[i]!=-)
sum[bi[i]]++;
for(int i=;i<=time1;i++)
if(sum[i])
{
ans++;
ans1*=sum[i];
}
printf("Case %d: ",T);
if(ans)
printf("%d %lld\n",ans,ans1);
else
printf("2 %d\n",n*(n-)/);}
return ;
}
先用tarjin找割点 割点条件u1是树根,且有大于1棵子树,u1不是树根,low[u[i]]>dfn[u1],把和一个割点相连的联通块建出口。
bzoj 2730: [HNOI2012]矿场搭建的更多相关文章
- BZOJ 2730: [HNOI2012]矿场搭建( tarjan )
先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...
- 【刷题】BZOJ 2730 [HNOI2012]矿场搭建
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- bzoj 2730: [HNOI2012]矿场搭建【tarjan】
先tarjan找割点和点双连通分量,然后对一个点双,如果没有割点,那么需要建立两个出口(割掉一个另一个备用):如果只有一个割点,出口可以设立在任意一个非割点的地方:如果有两个及以上个割点,就不用建出口 ...
- 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3230 Solved: 1540[Submit][Stat ...
- bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1147 Solved: 528[Submit][Statu ...
- [BZOJ2730][HNOI2012]矿场搭建 点双 割点
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2852 Solved: 1344[Submit][Stat ...
- BZOJ 2730:[HNOI2012]矿场搭建(割点+连通块)
[HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- 百度之星复赛Astar Round3
拍照 树状数组(SB了).求出静止状态下,每个点能看到多少个向右开的船c1[i],多少个向左开的船c2[i]. max{c1[i] + c2[j], (满足i <= j) }即为答案.从后往前 ...
- 使用myeclipse建立maven项目(重要)
maven是管理项目的,myeclipse是编写代码的.第一次写项目都要配置好多东西,很麻烦,now 来看看怎样新建一个maven项目. 工具/原料 myeclipse maven 方法/步骤 ...
- iOS开发之APP推送设置WIFI
在iOS开发过程中,有时需要连接网络.当访问请求,检测到网络不可用时,需要提示用户手动进行设置网络并告知用户操作路径设置可用的网络. 只需一行代码即可实现: - (void)viewDidLoad { ...
- 下载Android 5.0源码(附源码)
下载方法见我的另一篇博客:http://blog.csdn.net/maosidiaoxian/article/details/41680769 2014-12-24更新:5.0.1源码已上传. 这次 ...
- mybatis实战
这篇教程不错,推荐:http://blog.csdn.net/techbirds_bao/article/details/9233599/
- HTML的超链接
一.超链接概念: 超链接也叫 URL 中文翻译为资源定址器.这个定址器的功能主要告诉浏览器根据 URL的地址找到所需的资源.作用于连接资源 二.超链接的常用属性: 1.href=指定目的地,当有了hr ...
- kafka常用操作命令
1.启动Kafka,其中">>/dev/null"表示将日志信息输出到"黑洞",其中"2>&1"表示将错误信息和前 ...
- DRUID连接池的实用 配置详解
DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...
- iOS开发 设置状态栏样式
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:NO];
- 自己学习smarty的一些代码 和记录
http://www.yiibai.com/smarty/smarty_install.html 手册可以看这里 index.tpl <!DOCTYPE html> <html&g ...