题目传送门

这道题用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的更多相关文章

  1. 【BZOJ-2730】矿场搭建 Tarjan 双连通分量

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1602  Solved: 751[Submit][Statu ...

  2. bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1147  Solved: 528[Submit][Statu ...

  3. BZOJ 2730: [HNOI2012]矿场搭建( tarjan )

    先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...

  4. bzoj2730(矿场搭建)

    矿场搭建,不知道为什么,莫名其妙T了在212上,额,zyh数据真的坑. bzoj200轻松跑过啊. 就是点双联通分量缩点,然后标记割点,一个块如果有>=2个割点,则不需要挖矿洞, 如果只有一割点 ...

  5. 【CJOJ P1333】【HNOI2012】矿场搭建

    [HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...

  6. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  7. 【刷题】BZOJ 2730 [HNOI2012]矿场搭建

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  8. 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3230  Solved: 1540[Submit][Stat ...

  9. 【BZOJ】【2730】【HNOI2012】矿场搭建

    Tarjan求BCC/割点 然而似乎我一开始抄的白书的板子哪里抄错了?还是本身哪里不对……(可能是不适用于这道题?因为这题要求求出每个BCC的大小..? 膜拜了ydc的写法= = 其实两次dfs也并没 ...

随机推荐

  1. 使用ant进行邮件发送,ant发送已存在的html文件

    Jenkins上使用发送邮件功能一直有问题,放弃Jenkins配置,使用ant的进行发送邮件,参考文档可以: https://www.jianshu.com/p/04cfce59890a 我这里是要发 ...

  2. PHP-----JSOM类型数据

    JS里的数据类型 JS里的一种数据类型,JSOM类型数据 JSOM这种数据类型,在使用JS和jquery时经常使用的到,比较重要.用起来比较简单. <title>无标题文档</tit ...

  3. redis-desktop-manager 安装——redis的可视化工具

    一.redis-desktop-manager介绍 Redis可视化工具之一,RedisDesktopManager是开源的,托管在github上:https://github.com/uglide/ ...

  4. iview中table里嵌套i-switch、input、select等

    iview中table内嵌套 input render:(h,params) => { return h('Input',{ props: { value:'', size:'small', } ...

  5. spring使用 hibernate jpa JpaRepository

    使用JpaRepository需要两个架包: <dependency> <groupId>org.springframework.data</groupId> &l ...

  6. 【转载】对C#DateTime的一些扩展,计算周内第一天,最后一天

    /// <summary> /// DateTime的一些扩展 /// </summary> public class DateTime2 { /// <summary& ...

  7. 键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...

    一.有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下: (1) 键盘录入6个int类型的数据存入数组arr中: (2) 将arr数组中的内容反转: (3) 将反转后的数组角标 ...

  8. 浅谈React、Vue 部分异步

    React中的setState setState为什么需要异步? 无法限制何时使用异步,多次连续使用setState 防止多次渲染,异步rendering不仅仅是性能上的优化,而且这可能是react组 ...

  9. C++分享笔记:扑克牌的洗牌发牌游戏设计

    笔者在大学二年级期间,做过的一次C++程序设计:扑克牌的洗牌发牌游戏.具体内容是:除去大王和小王,将52张扑克牌洗牌,并发出5张牌.然后判断这5张牌中有几张相同大小的牌,是否是一条链,有几个同花等. ...

  10. binlog2sql 用法

    binlog2sql 用法 使用场景:binlog2sql是根据mysql的binlog (要求格式是row)反解析出delete,update操作,对误操作数据进行还原. https://githu ...