Description

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

Sulotion

坍塌的不是割顶并不影响,建在割顶也没有意义(拆割顶)

考虑每一个双连通分量,如果只连一个割顶必须内部建一个(随便选一个),连两个以上可以不用建(一个割顶坍塌还可以走另一个)

特殊情况是,如果无割顶建两个

并不需要求出双连通分量,把割顶求出删掉,dfs处理时统计即可

说起来这道题也是WF2011,HNOI竟然考原题。。

Code

一开始一直WA,copy标程大力对拍,结果是特殊情况忘输出case...范逗

接着拍,还是不对,调半天搞出一组小数据,然后发现标程错了...世界再见...这种事情以前就出现过一次...所以还是要自己老老实实写暴力对拍?

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<cstring>
  5. using namespace std;
  6. const int maxn=;
  7.  
  8. int pre[maxn],low[maxn],iscut[maxn],bcc[maxn];
  9. int clock,cnt,size[maxn],t[maxn],vis[maxn];
  10. vector<int>e[maxn];
  11. int n,m;
  12.  
  13. int clear(){
  14. memset(pre,,sizeof(pre));
  15. memset(low,,sizeof(low));
  16. memset(iscut,,sizeof(iscut));
  17. memset(bcc,,sizeof(bcc));
  18. memset(size,,sizeof(size));
  19. memset(t,,sizeof(t));
  20. memset(vis,,sizeof(vis));
  21. for(int i=;i<maxn;i++) e[i].clear();
  22. clock=cnt=n=;
  23. }
  24.  
  25. int getcut(int p,int u){
  26. pre[u]=low[u]=++clock;
  27. int child=;
  28. for(int i=;i<e[u].size();i++){
  29. int v=e[u][i];
  30. if(!pre[v]){
  31. child++;
  32. getcut(u,v);
  33. low[u]=min(low[u],low[v]);
  34. if(low[v]>=pre[u]){
  35. iscut[u]=;
  36. }
  37. }
  38. else if(pre[v]<pre[u]&&v!=p){
  39. low[u]=min(low[u],pre[v]);
  40. }
  41. }
  42. if(p==&&child==) iscut[u]=;
  43. }
  44.  
  45. int dfs(int u){
  46. vis[u]=cnt,size[cnt]++;
  47. for(int i=;i<e[u].size();i++){
  48. int v=e[u][i];
  49. if(vis[v]) continue;
  50. if(!iscut[v]) dfs(v);
  51. else {
  52. if(bcc[v]!=cnt)
  53. bcc[v]=cnt,t[cnt]++;
  54. }
  55. }
  56. }
  57.  
  58. int main(){
  59. //freopen("2730.in","r",stdin);
  60. //freopen("2730a.out","w",stdout);
  61.  
  62. int time=;
  63. while(scanf("%d",&m)==&&m){
  64. clear();
  65. int u,v;
  66.  
  67. for(int i=;i<=m;i++){
  68. scanf("%d%d",&u,&v);
  69. e[u].push_back(v);
  70. e[v].push_back(u);
  71. n=max(n,max(u,v));
  72. }
  73.  
  74. for(int i=;i<=n;i++)
  75. if(!pre[i]) getcut(,i);
  76.  
  77. for(int i=;i<=n;i++)
  78. if(!iscut[i]&&!vis[i]){
  79. ++cnt;
  80. dfs(i);
  81. }
  82.  
  83. if(cnt==){
  84. printf("Case %d: 2 %d\n",++time,n*(n-)/);
  85. continue;
  86. }
  87.  
  88. long long tot=,ans=;
  89. for(int i=;i<=cnt;i++)
  90. if(t[i]==) tot++,ans*=size[i];
  91. printf("Case %d: %lld %lld\n",++time,tot,ans);
  92. }
  93. }

【双连通分量】Bzoj2730 HNOI2012 矿场搭建的更多相关文章

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

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

  2. bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)

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

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

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

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

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

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

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

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

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

  7. BZOJ2730: [HNOI2012]矿场搭建

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

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

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

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

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

随机推荐

  1. 手机访问pc地址时直接跳到移动端

    function mobile_device_detect(url) { var thisOS = navigator.platform; var os = new Array("iPhon ...

  2. access登录窗口校验代码一

    Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...

  3. windows环境下zookeeper安装和使用

    一.简介        zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一 ...

  4. Django之AppConfig源码学习

    class AppConfig(object) 这个基类描述了一个Django应用以及它的配置信息. 属性: name:django应用的完整python路径,eg.'django.contrib.a ...

  5. BuautifulSoup4库详解

    1.BeautifulSoup4库简介 What is beautifulsoup ? 答:一个可以用来从HTML 和 XML中提取数据的网页解析库,支持多种解析器(代替正则的复杂用法) 2.安装 p ...

  6. JSP Debug日志

    2006年末一篇blog,那时候好生涩啊: 先谈两个关于reponse.sendRedirect()函数的问题 :      1.在Servlet的处理流或JSP的页面流中,sendRedirect( ...

  7. Java在线考试系统(含源码)

    本文demo下载和视频教学观看地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1076 本实例介绍了在线考 ...

  8. Ocelot中文文档-缓存

    目前Ocelot使用CacheManager项目提供了一些非常基本的缓存.这是一个了不起的项目,它解决了很多缓存问题. 我会推荐这个软件包来做Ocelot缓存. 如果你看看这里的例子,你可以看到如何设 ...

  9. Python人脸识别最佳教材典范,40行代码搭建人脸识别系统!

    Face Id是一款高端的人脸解锁软件,官方称:"在一百万张脸中识别出你的脸."百度.谷歌.腾讯等各大企业都花费数亿来鞭策人工智能的崛起,而实际的人脸识别技术是否有那么神奇? 绿帽 ...

  10. java基础- Collection和map

    使用构造方法时,需要保留一个无参的构造方法 静态方法可以直接通过类名来访问,而不用创建对象. -- Java代码的执行顺序: 静态变量初始化→静态代码块→初始化静态方法→初始化实例变量→代码块→构造方 ...