题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2730

首先一遍tarjan找出割点,将图缩点,这些大点中如果有只包含一个割点的,那么如果这个割点被去掉,则这个大点与图不连通,所以这个大点内必须有一个出口;

而如果没有割点,需要建两个出口,以防止一个出口点被去掉;

方案数就是放出口的大点的size乘积;没有割点则方案数为C(m,2);

注意自己记录点数。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int const MAXN=;
vector<int>dcc[MAXN];
int t,n,m,siz,tim,ct,head[MAXN],dfn[MAXN],low[MAXN],num,k;
long long ans;
bool vis1[MAXN],vis2[MAXN],cut[MAXN];
struct N{
int to,next;
N(int t=,int n=):to(t),next(n) {}
}edge[MAXN<<];
void add(int x,int y)
{
edge[++ct]=N(y,head[x]);head[x]=ct;
edge[++ct]=N(x,head[y]);head[y]=ct;
}
void tarjan(int x,int f)
{
dfn[x]=low[x]=++tim;
int fl=;
for(int i=head[x],u;i;i=edge[i].next)
{
if(edge[i].to==f)continue;
if(!dfn[u=edge[i].to])
{
fl++;
tarjan(u,x);
low[x]=min(low[x],low[u]);
if(low[u]>=dfn[x])/*fl++,*/cut[x]=;
}
else low[x]=min(low[x],dfn[u]);
}
if(!f&&fl==)cut[x]=;
}
int dfs(int x)
{
int siz=;
vis1[x]=;
for(int i=head[x],u;i;i=edge[i].next)
{
if(vis1[u=edge[i].to]||vis2[u])continue;
if(!cut[u])siz+=dfs(u);
// if(!cut[u])siz++,dfs(u);
else if(!vis2[u])vis2[u]=,num++;
}
return siz;
}
int main()
{
while(scanf("%d",&n)==)
{
if(!n)return ;
t++;ct=;
tim=;m=;//
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
memset(cut,,sizeof cut);
memset(head,,sizeof head);
memset(vis1,,sizeof vis1);
int x,y;
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
m=max(m,x);m=max(m,y);
}
for(int i=;i<=m;i++)
if(!dfn[i])tarjan(i,);
ans=;k=;
for(int i=;i<=m;i++)
if(!vis1[i]&&!cut[i])//不能是割点
{
num=;
memset(vis2,,sizeof vis2);
siz=dfs(i);
if(num==)k++,ans*=siz;
}
if(!k)k=,ans=(long long)m*(m-)/;//m!
printf("Case %d: %d %lld\n",t,k,ans);
}
return ;
}

bzoj2730矿场搭建——点双连通分量的更多相关文章

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

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

  2. BZOJ2730 [HNOI2012]矿场搭建[点双连通分量]

    看到删去一个点,需要剩下的都和关键点连通,有端联想到找点双,因为他怎么删点都是连通的. 对于一个孤立的点双,至少要设两个关键点. 如果两个点双以一个割点连接,假设断掉这个割点,两个块至少要各设一个关键 ...

  3. [BZOJ2730][HNOI2012]矿场搭建 点双 割点

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

  4. bzoj2730矿场搭建(Tarjan割点)

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

  5. [HNOI2012]矿场搭建 (点双连通)

    题目 [HNOI2012]矿场搭建 解析 这个题做的我十分自闭.. 没看出这个是个点双,然后一晚上+半上午.. 一看肯定和割点有关,我们找到所有的点双,会发现有这么几种情况 连通块中一个割点也没有,这 ...

  6. BZOJ2730 矿场搭建 解题报告 点双联通分量

    题意概述: 一张有向图,在其中设置一些关键点(即题目中的逃生出口),使得删除任意一个点之后其余点都可以到达至少一个关键点. 问至少需要设置多少中关键点,有多少种设置方法. 解析: 首先,这道题要求删掉 ...

  7. [BZOJ2730]矿场搭建

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

  8. 【双连通分量】Bzoj2730 HNOI2012 矿场搭建

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

  9. 洛谷 - P3225 - 矿场搭建 - 双连通分量

    https://www.luogu.org/problem/P3225 这个东西有点绕. 最平凡的情况,整个原图只有一个点,那么它坍塌了之后就没有点了,不需要进行任何逃生.否则,当一个点坍塌之后,每个 ...

随机推荐

  1. 近期微信上非常火的小游戏【壹秒】android版——开发分享

    近期在朋友圈,朋友转了一个html小游戏[壹秒],游戏的规则是:用户按住button然后释放,看谁能精准地保持一秒的时间.^_^刚好刚才在linuxserver上调试程序的时候server挂了,腾出点 ...

  2. 百科知识 isz文件如何打开

    使用UltraISO可以打开

  3. Office HPDeskjetD2468 打印机电源灯闪烁不停,打印机不工作怎么办

    怎么处理HP DeskjetD2468 打印机电源灯闪烁不停,打印机不工作? 最佳答案 一般电源灯闪烁时因为你的打印喷头上面的盖子没有盖好,你看看.....盖好之后关机再开 谢谢!

  4. 谈一次Linux的木马攻击数据爆满造成的Mysql无法启动

    起初以为是mysql它们之间的扩展没有开启! 后来发现,木马的确使它初始化了,最开始没有用图形化界面 而后,修改并且开启所有pdo扩展 VIM基本操作(除了插入,其它的命令前提是按ESC): 插入: ...

  5. 用Visual C++ 2010 载入动态链接库三部曲(使用第三方库的一般方法)

    以下以载入编译好的ACE动态链接库为例说明:这里如果你已经设置了环境变量ACE_ROOT ACE在VS2010下高速配置载入动态链接库三部曲:(这里如果你的ACE文件夹为E:\ACE_wrappers ...

  6. Android——动画的分类

    Android包含三种动画:View Animation, Drawable Animation, Property Animation(Android 3.0新引入). 1.View Animati ...

  7. 使用Android注解来改善代码

    昨晚看到一篇好文章.然后是英文的.所以决定翻译分享给大家.这是原文链接:http://www.michaelevans.org/blog/2015/07/14/improving-your-code- ...

  8. LeetCode -- 反转英文单词

    问题:给定英文句子.反转里面的每一个单词.比如"the sky is blue" 反转后为 "blue is the sky" 实现思路:对英文句子每一个字符做 ...

  9. Android Volley分析(一)——结构

    Volley是Android系统下的一个网络通信库.为Android提供简单高速的网络操作(Volley:Esay, Fast Networking for Android),以下是它的结构: 既然是 ...

  10. BUCK电路工作原理

    Buck电路,也称呼为DC_DC Buck型降压开关电源电路,这种电路结构实际应用也是很多的,电路拓扑结构看下图: 电路中,Q1是开关管,D1是续流二极管,L1就是问题中提到的这个电感器.C1就是问题 ...