题目传送门

这道题用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. 如何玩转Android远控(androrat)

    关于WebView中接口隐患与手机挂马利用的引深 看我是怎样改造Android远程控制工具AndroRat 1.修改布局界面 2.配置默认远程ip和端口 3.LauncherActivity修改为运行 ...

  2. python UI自动化实战记录五:测试页面2 pageobject

    该部分记录测试页面2-StrategyPage,所有页面2上的元素定位.操作.获取属性等方法都写在该类中. 1 页面2继承自BasePage: 2 页面2第一部分写的是所有的定位器 3 页面2第二部分 ...

  3. ParameterDirection中的参数(Input,Output,InputOutput,ReturnValue)

    ParameterDirection中的参数类型定义,首先看ParameterDirection定义 // 摘要: // 指定查询内的有关 System.Data.DataSet 的参数的类型. pu ...

  4. VS 2013 scanf 报错问题

    在VS2013 用C/C++编码时 使用scanf 会出现如下错误信息: 解决方法如下: 1. 在工程文件名出右击鼠标打开快捷菜单,找到“属性”选项,进入项目属性页面 2. 进入属性页面,找到“配置属 ...

  5. 安卓渗透测试工具Drozer学习笔记

    下载,并安装. pip安装即可,安装完成后可能会出现缺少twisted依赖库的问题 ➜ vul git:(master) ✗ drozer console connect drozer Server ...

  6. VBA与宏

    VBA与宏 ====== 刚开始的内容听起来很枯燥,请大家不要分心,耐着性子看下去,兴趣总是慢慢积累的. ----------------------------------------------- ...

  7. Many-to-many relationships in EF Core 2.0 – Part 3: Hiding as ICollection

    In the previous post we ended up with entities that hide the join entity from the public surface. Ho ...

  8. 用HTML编写迪士尼乐园页面

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/html"><head lang="e ...

  9. Oracle GoldenGate同步服务归档空间维护

    ORA-00257: archiver error. Connect internal only, until freed 查看归档日志序列 SQL> archive log list; Aut ...

  10. iOS | 解决中文乱码

    在iOS开发中,多多少少的朋友在开发的过程中,测试数据的时候可能会碰到后台打印的时候不能正确的打印出正常的汉字,打印出一些影响判断的字符,经常需要查看数组中得元素是否是自己想要的,但是苹果并没有对直接 ...