2730: [HNOI2012]矿场搭建

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1147  Solved: 528
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

9
1 3
4 1
3 5
1 2
2 6
1 5
6 3
1 6
3 2
6
1 2
1 3
2 4
2 5
3 6
3 7
0

Sample Output

Case 1: 2 4
Case 2: 4 1

HINT

Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);
Case 2 的一组解为(4,5,6,7)。

【思路】

点-双连通分量。

求出bcc,对于每个bcc而言,最优的方案就是在每一个只有一个割点的bcc中安置一个逃生装置。

【代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<stack>
  4. #include<vector>
  5. #include<iostream>
  6. #include<cstdlib>
  7. #define FOR(a,b,c) for(int a=(b);a<(c);a++)
  8. using namespace std;
  9.  
  10. typedef long long LL;
  11. const int maxn = +;
  12.  
  13. struct Edge{ int u,v;
  14. };
  15.  
  16. int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;
  17. vector<int> G[maxn],bcc[maxn];
  18.  
  19. stack<Edge> S;
  20.  
  21. int dfs(int u,int fa) {
  22. int lowu=pre[u]=++dfs_clock;
  23. int ch=;
  24. for(int i=;i<G[u].size();i++) {
  25. int v=G[u][i];
  26. Edge e=(Edge) {u,v};
  27. if(!pre[v]) {
  28. S.push(e);
  29. ch++;
  30. int lowv=dfs(v,u);
  31. lowu=min(lowu,lowv);
  32. if(lowv>=pre[u]) {
  33. iscut[u]=;
  34. bcc_cnt++; bcc[bcc_cnt].clear();
  35. for(;;) {
  36. Edge x=S.top(); S.pop();
  37. if(bccno[x.u]!=bcc_cnt) bcc[bcc_cnt].push_back(x.u),bccno[x.u]=bcc_cnt;
  38. if(bccno[x.v]!=bcc_cnt) bcc[bcc_cnt].push_back(x.v),bccno[x.v]=bcc_cnt;
  39. if(x.u==u && x.v==v) break;
  40. }
  41. }
  42. }
  43. else if(pre[v]<pre[u] && v!=fa) {
  44. S.push(e); lowu=min(lowu,pre[v]);
  45. }
  46. }
  47. if(fa< && ch==) iscut[u]=;
  48. return lowu;
  49. }
  50. void find_bcc(int n) {
  51. memset(pre,,sizeof(pre));
  52. memset(iscut,,sizeof(iscut));
  53. memset(bccno,,sizeof(bccno));
  54. dfs_clock=bcc_cnt=;
  55. for(int i=;i<n;i++)
  56. if(!pre[i]) dfs(i,-);
  57. }
  58.  
  59. int n,m,kase;
  60.  
  61. int main() {
  62. while(scanf("%d",&m) && m) {
  63. int u,v;
  64. n=;
  65. for(int i=;i<*m;i++) G[i].clear();
  66. for(int i=;i<m;i++) {
  67. scanf("%d%d",&u,&v);
  68. u--,v--;
  69. n=max(n,max(u,v));
  70. G[u].push_back(v);
  71. G[v].push_back(u);
  72. }
  73. while(!S.empty()) S.pop();
  74.  
  75. find_bcc(n);
  76.  
  77. LL ans1=,ans2=;
  78. for(int i=;i<=bcc_cnt;i++) {
  79. int cnt=;
  80. for(int j=;j<bcc[i].size();j++)
  81. if(iscut[bcc[i][j]]) cnt++;
  82. if(cnt==) {
  83. ans1++; ans2*=(long long)(bcc[i].size()-);
  84. }
  85. }
  86. if(bcc_cnt==) {
  87. ans1=; ans2=bcc[].size()*(bcc[].size()-)/;
  88. }
  89. printf("Case %d: %lld %lld\n",++kase,ans1,ans2);
  90. }
  91. return ;
  92. }

bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)的更多相关文章

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

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

  2. BZOJ2730——[HNOI2012]矿场搭建

    bzoj2730 & world final 2011 H 1.题目大意:就是有一个无向图,让你在里面选择点,使得,无论哪个点没了以后,其他的点都能到达你选择的任何一个点,输出最少 选择几个点 ...

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

    Solution 输入中没有出现过的矿场点是不用考虑的, 所以不用考虑只有 一个点 的点双联通分量. 要使某个挖矿点倒塌, 相当于割去这个点, 所以我们求一遍割点和点双联通分量. 之后的点双联通分量构 ...

  4. BZOJ2730: [HNOI2012]矿场搭建

    传送门 图的连通性相关的必和割点割边之类的有关. 题目要求对于一个无向图,任意一点被删除后,所有点都和某些指定点是联通的. 这道题比较简单的做法就是求出来所有的块.对于一个块,如果块里有两个及两个以上 ...

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

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

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

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

  7. BZOJ2730:[HNOI2012]矿场搭建(双连通分量)

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

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

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

  9. [BZOJ2730]:[HNOI2012]矿场搭建(塔尖)

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

随机推荐

  1. [转] linux中cat more less head tail 命令

    1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 比如: [root@localhost ~]# c ...

  2. 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理

    本节和<Android群英传>中的第3章Android控件架构与自定义控件详解有关系,建议先阅读该章的总结 第4章 View的工作原理 4.1 初始ViewRoot和DecorView ( ...

  3. Android MediaCodec 使用例子

    Android MediaCodec 使用例子 下面的例子是使用MediaCodec 录制到文件的例子. 1 public class AvcEncoder { private MediaCodec ...

  4. js页面加载事件

    <body onload="myfunction()" > </body> <script type="text/javascript&qu ...

  5. HDU3853

    题意:给R*C的迷宫,起点为1,1 终点为R,C 且给定方格所走方向的概率,分别为原地,下边,右边,求到终点的期望. 思路:既然是求到终点的期望,那么DP代表期望,所以DP[i][j]=原地的概率*D ...

  6. Spring框架

    Spring框架的根本使命是:简化JAVA开发,为了简化开发,有以下四个策略 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯性进行声明式编程: 通过切面和模板 ...

  7. (Excel导出失败)检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失

    在DCOM 中不存在WORD.EXCEL等OFFICE组件   最近在做一个关于office转存PDF的Web项目.开发过程一切顺利. 起初在网上找到一些Word,PPT转PDF的代码.很好用.一切顺 ...

  8. 关于uploadify 没有显示进度条!!!!

    如果你也弄了很久不知道为什么不出现上传进度条!,那就一定要看这里了! 我注释了 queueID 属性后 就出现了!!!!! 就是这么简答! //添加界面的附件管理 $('#file_upload'). ...

  9. WearableListView的使用和一些思考

    今年加盟了一家做手表的公司,至此开启了androidwear(类)的开发之门. 近日要做一个手表上的List显示,为此也是花了很多的心思在List效果上,多日下来,有些心得. 一.需求确定: 手表上的 ...

  10. ViewHolder的作用和用法

    一直都看别人用ViewHolder,自己也用过,却不知道它的作用是什么?但知道肯定很有用,而且现在android studio应该有直接生产Viewholder的插件, 不过博主我是个新手,就没尝试去 ...