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

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

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

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

注意自己记录点数。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<vector>
  5. using namespace std;
  6. int const MAXN=;
  7. vector<int>dcc[MAXN];
  8. int t,n,m,siz,tim,ct,head[MAXN],dfn[MAXN],low[MAXN],num,k;
  9. long long ans;
  10. bool vis1[MAXN],vis2[MAXN],cut[MAXN];
  11. struct N{
  12. int to,next;
  13. N(int t=,int n=):to(t),next(n) {}
  14. }edge[MAXN<<];
  15. void add(int x,int y)
  16. {
  17. edge[++ct]=N(y,head[x]);head[x]=ct;
  18. edge[++ct]=N(x,head[y]);head[y]=ct;
  19. }
  20. void tarjan(int x,int f)
  21. {
  22. dfn[x]=low[x]=++tim;
  23. int fl=;
  24. for(int i=head[x],u;i;i=edge[i].next)
  25. {
  26. if(edge[i].to==f)continue;
  27. if(!dfn[u=edge[i].to])
  28. {
  29. fl++;
  30. tarjan(u,x);
  31. low[x]=min(low[x],low[u]);
  32. if(low[u]>=dfn[x])/*fl++,*/cut[x]=;
  33. }
  34. else low[x]=min(low[x],dfn[u]);
  35. }
  36. if(!f&&fl==)cut[x]=;
  37. }
  38. int dfs(int x)
  39. {
  40. int siz=;
  41. vis1[x]=;
  42. for(int i=head[x],u;i;i=edge[i].next)
  43. {
  44. if(vis1[u=edge[i].to]||vis2[u])continue;
  45. if(!cut[u])siz+=dfs(u);
  46. // if(!cut[u])siz++,dfs(u);
  47. else if(!vis2[u])vis2[u]=,num++;
  48. }
  49. return siz;
  50. }
  51. int main()
  52. {
  53. while(scanf("%d",&n)==)
  54. {
  55. if(!n)return ;
  56. t++;ct=;
  57. tim=;m=;//
  58. memset(dfn,,sizeof dfn);
  59. memset(low,,sizeof low);
  60. memset(cut,,sizeof cut);
  61. memset(head,,sizeof head);
  62. memset(vis1,,sizeof vis1);
  63. int x,y;
  64. for(int i=;i<=n;i++)
  65. {
  66. scanf("%d%d",&x,&y);
  67. add(x,y);
  68. m=max(m,x);m=max(m,y);
  69. }
  70. for(int i=;i<=m;i++)
  71. if(!dfn[i])tarjan(i,);
  72. ans=;k=;
  73. for(int i=;i<=m;i++)
  74. if(!vis1[i]&&!cut[i])//不能是割点
  75. {
  76. num=;
  77. memset(vis2,,sizeof vis2);
  78. siz=dfs(i);
  79. if(num==)k++,ans*=siz;
  80. }
  81. if(!k)k=,ans=(long long)m*(m-)/;//m!
  82. printf("Case %d: %d %lld\n",t,k,ans);
  83. }
  84. return ;
  85. }

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. 转: 多版本并发控制(MVCC)在分布式系统中的应用 (from coolshell)

    from:  http://coolshell.cn/articles/6790.html 问题 最近项目中遇到了一个分布式系统的并发控制问题.该问题可以抽象为:某分布式系统由一个数据中心D和若干业务 ...

  2. C++简单介绍

    一.怎样用C++的源文件产生一个可运行程序 一个C++程序由一个或者多个编译单元组成.每一个编译单元都是一个独立的源码文件.一般是一个带.cpp的文件,编译器每次编一个文件编译单元,生成一个以.obj ...

  3. C/C++中怎样获取日期和时间

    C/C++中怎样获取日期和时间摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时.时间的获取.时间的计算和显示格式等方面进行了阐述.本文还通过大量的实 ...

  4. redis 3.0.1 在CentOS上的安装

    一.下载 wget http://download.redis.io/releases/redis-3.0.1.tar.gz 二.解压 tar xzf redis-3.0.1.tar.gz 三.进入 ...

  5. SpringBoot学习之@Controller和@RestController

    今天我们来研究一下@Controller和@RestController的用法 @Controller 1.Controller可以用来跳转页面,并且必须配合模板来使用. @Controller // ...

  6. [转]eclipse查看某个java类属于哪个jar包

    原文地址:https://blog.csdn.net/csdnliuxin123524/article/details/73572836 在eclipse界面直接按ctrl+shift+t,弹出以下界 ...

  7. 实习日记 laravel怎么删除磁盘上的文件

    Storage 里面有 delete的方法 具体使用是 Storage::disk('uploads')->delete($fileName); 其中'uploads'是filesystem里面 ...

  8. git clean

    使用git clean清除未加入版控的数据 作者:Level Up  发布日期:2012-12-21 10:48:10       笔者在使用版本控制软件时,不知为何常常会有些暂存的数据产生.像是下面 ...

  9. kubernetes调度之资源配额

    系列目录 当多个用户或者开发团队共享一个有固定节点的的kubernetes集群时,一个团队或者一个用户使用的资源超过他应当使用的资源是需要关注的问题,资源配额是管理员用来解决这个问题的一个工具. 资源 ...

  10. oracle sql 当初始化数据时避免重复主键

    一:当有主键序列自动增长时候(序列为:seq_cct_id) insert into cs_cost_type (CCT_ID, CCT_NAME, CCT_RATE, CCT_RATE_TYPE, ...