题目: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. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

    两个月之前准备软考时,简单的从理论上总结了最经常使用的数据结构和算法,比方:线性表,链表,图.在进行java开发时,jdk为我们提供了一系列对应的类来实现主要的数据结构.jdk所提供的容器API位于j ...

  3. Plug and Play

    http://baike.baidu.com/view/33701.htm 即插即用 编辑   PNP是Plug-and-Play(即插即用)的缩写.它的作用是自动配置(低层)计算机中的板卡和其他设备 ...

  4. tree related problems (update continuously)

    leetcode Binary Tree Level Order Traversal 这道题是要进行二叉树的层次遍历.对于层次遍历,最简单直观的办法就是进行BFS.于是我们仅仅须要维护一个队列就能够了 ...

  5. Linux的基本使用

    检测某个地址是否可以通信:ping xx.xx.xx.xx 检测某个端口是否开启:telnet xx.xx.xx.xx port 端口:用来区别不同服务 常用命令: 创建一个目录 /data mkdi ...

  6. PE发送报文

    步骤: 1. 在 action 中使用发送报文,要指定报文在 router 端的交易名称 2. 如果使用 supe.execute(context) 来发送,不需要第一步 3. 配置从网银到 rout ...

  7. Mac OS command line TestNG - “Cannot find class in classpath” error

    直接eclipse执行.xml文件可以正确执行 在mac下执行却总报错: [TestNG] [Error] Cannot find class in classpath 最后解决办法,classpat ...

  8. Html5的placeholder属性(IE兼容)

    HTML5对Web Form做了很多增强,比方input新增的type类型.Form Validation等. Placeholder是HTML5新增的还有一个属性,当input或者textarea设 ...

  9. shift:解决shell编程中的入渗问题

    我说过了,shell是我的常规武器,目前虽然还不纯熟,但是我爱shell这门语言,在Linux下面混,总要写脚本.程序员是有基因,对编程语言是有偏好的,你让我写C代码,我会觉得很爽,会有困难,会有痛苦 ...

  10. Sparksql 取代 Hive?

    sparksql  hive https://databricks.com/blog/2014/07/01/shark-spark-sql-hive-on-spark-and-the-future-o ...