问题 F: [HNOI2012]矿场搭建

时间限制: 1 Sec  内存限制: 128 MB

题目描述

煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。

输入

输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖       S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。

输出

输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。

样例输入

9                       1  3                     4  13  51  22  61  56  31  63  26 1  21  32  42  53  63  70 

样例输出

Case 1: 2 4Case 2: 4 1

提示

Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);
    用到了点双连通分量,定义是这个连通块通过割点与其它块分开,而割点一旦去掉整个块就不连通了,那么也就和这道题扯上了关系。对于一个点双连通分量,如果他只有一个割点,那他必须建一个(在非割点),不然割点塌了这个点双连通分量就毁了。。如果有两个以上割点,不用建,因为就算一个割点塌了,还可以通过另一个跑掉(狡兔三窟~),也对于没有割点的(就是自己只连自己)必须建两个,如果碰巧你建的点塌了,就又毁掉了。。
    那么就很明确了。只是到底有多少种方法求点双连通分量,我也不知道,但貌似一人一种。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define N 500
#define ll long long
using namespace std;
struct node
{int v,next;
} lu[N*2+5];
int zhan[N*2+5];
int dfn[N*2+5],low[N*2+5],belong[N*2+5];
int n,m,adj[N*2+5],e,cnt,ji,head;
ll ans2=1,ans1=0;
void add(int u,int v){lu[++e].v=v;lu[e].next=adj[u];adj[u]=e;}
void init()
{memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(adj,0,sizeof(adj));memset(belong,0,sizeof(belong));head=e=ji=0;ans1=0;ans2=1;
}
void tarjin(int x)
{dfn[x]=low[x]=++ji;for(int i=adj[x];i;i=lu[i].next){int to=lu[i].v;if(dfn[to])low[x]=min(low[x],dfn[to]);else{tarjin(to);low[x]=min(low[x],low[to]);if(low[to]>=dfn[x])belong[x]++;}}
}
void dfs(int x)
{low[x]=dfn[x]=++ji;zhan[++head]=x;for(int i=adj[x];i;i=lu[i].next){int to=lu[i].v;if(dfn[to])low[x]=min(low[x],dfn[to]);else{dfs(to);low[x]=min(low[x],low[to]);if(low[to]>=dfn[x]){int t,temp=0,size=0;while(1){t=zhan[head--];if(belong[t]>=2)temp++;size++;if(t==to)break;}t=x;if(belong[t]>=2)temp++;++size;if(!temp)ans1+=2,ans2*=size*(size-1)/2;else if(temp==1)ans1++,ans2*=size-1;}}}
}
int yjn()
{
//  freopen("bzoj_2730.in","r",stdin);
//  freopen("bzoj_2730.out","w",stdout);int u=0;while(++u){scanf("%d",&m);if(m==0)break;init();int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);n=max(n,max(x,y));}for(int i=1;i<=n;i++)if(!dfn[i])tarjin(i);elsebelong[i]++;memset(dfn,0,sizeof(dfn));ji=0;for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);cout<<"Case "<<u<<": ";    cout<<ans1<<' '<<ans2<<endl;    }
}
int qty=yjn();
int main(){;}

点双连通分量 [HNOI2012]矿场搭建相关推荐

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

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

  2. 【bzoj2730】 HNOI2012—矿场搭建

    http://www.lydsy.com/JudgeOnline/problem.php?id=2730 (题目链接) 题意 给出一张图,问如果删掉其中一个点,使得其他每个节点都有一个安全撤离的出口, ...

  3. P3225 [HNOI2012] 矿场搭建

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

  4. bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双

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

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

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

  6. Tarjan水题系列(2):HNOI2012 矿场搭建

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

  7. [HNOI2012]矿场搭建

    题解: 首先显然这是要缩点的 缩点双 直接对割点之间的联通块判断一下连着几个割点 连0个 cnt*(cnt-1)/2 连1个 cnt 连2个 0 代码: #include <bits/stdc+ ...

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

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

  9. [BZOJ2730][HNOI2012]矿场搭建(求割点)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...

最新文章

  1. 硕士生两年发14篇论文!获浙大最高层次奖学金!
  2. android studio 跳转后保留原页面数据_Intent详解以及Activity的跳转与数据传递
  3. 阿里为啥放弃Oracle、Hadoop,选择全面拥抱它!网友:断臂求生?
  4. linux 天堂测试软件,[Ubuntu] HTTP Live Streaming 安装测试
  5. ES业界优秀实践案例汇总
  6. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游
  7. 2.7 HBase架构深入剖析
  8. windows操作系统中配置java环境
  9. ajax如何解决浏览器缓存问题
  10. 中国男人何时回归家庭?(转)
  11. SAP Spartacus基于travis的持续集成
  12. 使用可视化工具redisclient连接redis
  13. C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)
  14. 爬虫:验证码识别准确率(Tesseract-OCR)
  15. mysql数据库表字段使用DESC等关键字报错及解决方法
  16. UML类图关系全面剖析[转]
  17. centos下yum安装wget失败
  18. mac os 使用记录
  19. 【经典算法题】排列序列
  20. C++ limits头文件的用法(numeric_limits)

热门文章

  1. 对Unity一个Shader编译Bug的分析(Unrecognized sampler 'samplerunity_lightmap)
  2. Window11 安装 安卓应用程序
  3. 语音识别之HTK入门
  4. vip_goup pro_ solv_idea
  5. 【百度语音爬坑】-JAVA对PCM文件格式处理(已解决)
  6. Chrome好用插件推荐
  7. PDM系统的实施说明书
  8. 常用的GNOME Shell 扩展
  9. Vue环境下,点击按钮进行上下页的切换
  10. 简单描述计算机主机不启动故障,电脑启动不了是什么问题