传送门

对于一个点双联通分量,如果它连接了两个或更多割点

那么不论哪个点GG都有至少一条路通到其他的点双联通分量,所以我们不用考虑

如果它只连接一个割点,如果这个割点GG,那整个块也一起GG,所以要再这个块里建一个出口

如果它没有连接割点,只建一个出口还不够,可能这个出口所在的点GG,所以要两个出口

那么三种情况的各自的方案数分别为

1 (啥都不干)

块内点的大小 (块内的每个点都可以建出口)

$C_{块内点的大小}^2$ (块内顺便选两个点建出口)

根据乘法原理把每个块的方案数乘起来就是总方案数了

然后Tarjan求出所有割点和点双联通分量就好了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e4+;
int fir[N],from[N<<],to[N<<],cntt;
inline void add(int &a,int &b)
{
from[++cntt]=fir[a];
fir[a]=cntt; to[cntt]=b;
}
int dfs_clock,dfn[N],low[N],st[N],Top,cut[N],rt,tot;
vector <int> be[N];//be[i][j]存属于第i个块的第j个点
void Tarjan(int x)//Tarjan模板求割点
{
dfn[x]=low[x]=++dfs_clock; st[++Top]=x;
int ch=;
for(int i=fir[x];i;i=from[i])
{
int &v=to[i];
if(!dfn[v])
{
Tarjan(v); ch++;
low[x]=min(low[x],low[v]);
if((x==rt&&ch>)||(x!=rt&&dfn[x]<=low[v])) cut[x]=;//注意节点为根时要特判
if(dfn[x]<=low[v])
{
be[++tot].clear();//注意多组数据
while(st[Top]!=v)
be[tot].push_back(st[Top--]);
be[tot].push_back(st[Top--]);
be[tot].push_back(x);//把割点也算进相邻的点双,方便统计
}
}
else low[x]=min(low[x],dfn[v]);
}
}
int n,m;
ll ans1,ans2;
int main()
{
int a,b,num=;
while(scanf("%d",&m)&&m)
{
memset(cut,,sizeof(cut));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(fir,,sizeof(fir));
n=tot=dfs_clock=Top=cntt=ans1=; ans2=;//初始化
for(int i=;i<=m;i++)
{
a=read(); b=read();
add(a,b); add(b,a);
n=max(n,max(a,b));//节点数还要自己求
}
for(int i=;i<=n;i++) if(!dfn[i]) rt=i,Tarjan(i);
for(int i=;i<=tot;i++)
{
int len=be[i].size(),cnt=;
for(int j=;j<len;j++) cnt+=cut[be[i][j]];//记录割点个数
if(!cnt)//如果没割点
ans1+=2,ans2*=((1ll*len*(len-))>>);
else if(cnt==) ans1++,ans2*=(len-);//注意len-1,因为len包括一个割点
}
printf("Case %d: %lld %lld\n",++num,ans1,ans2);
}
return ;
}

P3225 [HNOI2012]矿场搭建的更多相关文章

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

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

  2. 洛谷——P3225 [HNOI2012]矿场搭建

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

  3. P3225 [HNOI2012]矿场搭建 割点 tarjan 双联通分量

    https://www.luogu.org/problemnew/show/P3225 题意 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条 ...

  4. P3225 [HNOI2012]矿场搭建 题解

    这道题挺难的,可以加深对割点的理解,还有,排列组合好重要了,分连通块,然后乘法原理(加法原理计数什么的) 传送门   https://www.luogu.org/problem/P3225 省选oi题 ...

  5. 洛谷P3225 HNOI2012 矿场搭建

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

  6. 洛谷 P3225 [HNOI2012]矿场搭建

    传送门 题目大意:建设几个出口,使得图上无论哪个点被破坏,都可以与出口联通. 题解:tarjian求割点 首先出口不能建在割点上,找出割点,图就被分成了几个联通块. 每个联通块,建出口.如果割点数为0 ...

  7. [Luogu] P3225 [HNOI2012]矿场搭建

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

  8. P3225 [HNOI2012]矿场搭建 tarjan割点

    这个题需要发现一点规律,就是先按割点求块,然后求每个联通块中有几个割点,假如没有割点,则需要建两个出口,如果一个割点,则需要建一个出口,2个以上不用建. 题干: 题目描述 煤矿工地可以看成是由隧道连接 ...

  9. 洛谷—— P3225 [HNOI2012]矿场搭建

    https://www.luogu.org/problem/show?pid=3225 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有 ...

随机推荐

  1. 运行shell脚本报/bin/bash^M: bad interpreter错误排查方法

    今天遇到一个奇怪的问题,从一个服务器上down下来的脚本,在本地电脑做了点修改之后,上传到另外一台服务器上来执行,就报这个错误,问度娘,是编码格式的问题,windows把sh格式的编码改成dos格式的 ...

  2. sqlplus--sqlldr基础运用

    a.ctl load data                                         infile *                                     ...

  3. 第2章 netty介绍与相关基础知识

    NIO有一个零拷贝的特性.Java的内存有分为堆和栈,以及还有字符串常量池等等.如果有一些数据需要从IO里面读取并且放到堆里面,中间其实会经过一些缓冲区.我们要去读,它会分成两个步骤,第一块它会把我们 ...

  4. Elasticsearch - glossary

    From http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/glossary.html glossary of ...

  5. 适合新手的Python爬虫小程序

    介绍:此程序是使用python做的一个爬虫小程序  爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...

  6. 构建一个在线ASCII视频流服务

    构建一个在线ASCII视频流服务 2018-03-26  正常的文章 1685 什么是ASCII视频流服务? 其实这个名字是咱胡乱起的,具体叫啥我也不清楚,但效果如下: 大家可以在自己的命令行里试下, ...

  7. opencv中读写视频

    1.介绍 OpenCV 读写视频之前,先介绍一下编解码器(codec) .如果是图像文件, 我们可以根据文件扩展名得知图像的格式.但是此经验并不能推广到视频文件中. 有些 OpenCV 用户会碰到奇怪 ...

  8. Python程序设计4——控制语句

    1 print和import的更多信息 1.1 使用逗号输出 前面已经讲解过如何使用print来打印表达式,可以使用都好来打印多个表达式,只要用逗号隔开即可. >>> print ' ...

  9. (转)Linux操作系统下VMware的多网卡桥接转换

    VMware,鼎鼎大名的虚拟机软件,没有人不知道吧?当然,在Linux下使用虚拟机软件,并不一定需要使用VMWare,Xen也是非常不错的选择,有很多评测就认为XEN的表现优于VMware.可惜的是X ...

  10. java IO的总结

    1: fileChannel 没有bufferedreader快, bufferedreader 可设置缓冲大小和编码 2: bufferedreader 的readline 遇到回车也换行