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. Android Studio 快捷键(转)

    Android Studio 快捷键 操作 Mac OSX Win/Linux 注释代码(//) Cmd + / Ctrl + / 注释代码(/**/) Cmd + Option + / Ctrl + ...

  2. 循序渐近学docker---笔记

    1.安装docker 环境:ubuntu 16.04 sudo apt-get install docker.io root@ld-Lenovo-G470:~# docker -vDocker ver ...

  3. JSON 遍历转为Model Bean

    @RequestMapping(value = "/batchAddPageIndexBrand") @ResponseBody public HashMap<String, ...

  4. AES对称加密算法

    package cn.jsonlu.passguard.utils; import org.apache.commons.codec.binary.Base64; import javax.crypt ...

  5. memcache的安装及管理

    一.Memcache概述 Memcache(内存,缓存):是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个巨大的hash表.(key=value)(是用C语言开发的,并且需要libeven ...

  6. asp.net中调用COM组件发布IIS时常见错误 80070005解决方案

    很多人在.net开发Web站点中引用了COM组件,调试时一切正常,但一发布到IIS下就提示如下错误: 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005 ...

  7. EXT ajax简单实例

    转载:http://www.cnblogs.com/xiepeixing/archive/2012/10/24/2736751.html EXT ajax request是ext中对于ajax请求的实 ...

  8. (转)ThinkPHP find方法 查询一条数据记录

    find() ThinkPHP find() 方法是和 select() 用法类似的一个方法,不同之处 find() 查询出来的始终只有一条数据,即系统自动加上了 LIMIT 1 限制. 当确认查询的 ...

  9. 强引用,弱引用,4种Java引用浅解(涉及jvm垃圾回收)

    http://www.jb51.net/article/49085.htm http://www.jb51.net/article/49085.htm

  10. bitmap index

    bitmap index 说明: set echo on drop table t purge; create table t ( processed_flag ) ); create bitmap ...