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也并没 ...
随机推荐
- 中间人攻击之劫持登录会话(cookies)
关于中间人攻击 中间人攻击(Man-in-the-MiddleAttack,简称"MITM攻击")是一种"间接"的入侵攻击,这种攻击模式是通过各种技术手段将受入 ...
- 022configparser模块
#配置模块 #创建import configparser config = configparser.ConfigParser() #添加config["DEFAULT"] ...
- c++由string组成的struct初始化崩溃
struct _UserInfo { string username; string password; string ip; string port; } _UserInfo str={}; 这样就 ...
- Hadoop-2.2.0中文文档—— Common - 超级用户模拟别的用户
简单介绍 此文档描写叙述了一个超级用户怎样在安全的方式下以还有一用户的名义提交作业或訪问hdfs. Use Case 下一部分描写叙述的的代码演示样例对此用户用例是可用的. 一个username为's ...
- UVA12034 Race
嘟嘟嘟 令dp[i]表示在n个人中,有 i 个人获得第一名的方案数,转移方程为dp[i] = C(i, n) * dp[n - i].C(i, n)就是从n个人中选 i 个第一,那么剩下的n - i ...
- js获取当前URL、参数、端口、IP等信息
以下列出均为常用(转自地址为:https://blog.csdn.net/pengShuai007/article/details/78357238?locationNum=9&fps=1 1 ...
- Many-to-many relationships in EF Core 2.0 – Part 2: Hiding as IEnumerable
In the previous post we looked at how many-to-many relationships can be mapped using a join entity. ...
- java向邮箱发送消息失败!
出现的错误如下: org.apache.commons.mail.EmailException: Sending the email to the following server failed : ...
- 课时25.a标签基本使用(掌握)
什么是a标签? 我们打开百度或者淘宝网页,观察任何一个超链接都会发现它有如下特质: 有下划线 移上去有小手指 可以点击 a标签的作用:就是用于控制页面与页面之间跳转的 a标签的格式:<a hre ...
- Shell脚本之Crontab的格式
Crontab的格式 第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 ...