先tarjan找割点和点双连通分量,然后对一个点双,如果没有割点,那么需要建立两个出口(割掉一个另一个备用);如果只有一个割点,出口可以设立在任意一个非割点的地方;如果有两个及以上个割点,就不用建出口(可以直接到达其他联通块)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=1005;
  6. int n,m,h[N],cnt,cas,ans1,dfn[N],low[N],tot,bl[N],s[N],top;
  7. long long ans2;
  8. struct qwe
  9. {
  10. int ne,to;
  11. }e[N];
  12. int read()
  13. {
  14. int r=0,f=1;
  15. char p=getchar();
  16. while(p>'9'||p<'0')
  17. {
  18. if(p=='-')
  19. f=-1;
  20. p=getchar();
  21. }
  22. while(p>='0'&&p<='9')
  23. {
  24. r=r*10+p-48;
  25. p=getchar();
  26. }
  27. return r*f;
  28. }
  29. void add(int u,int v)
  30. {
  31. cnt++;
  32. e[cnt].ne=h[u];
  33. e[cnt].to=v;
  34. h[u]=cnt;
  35. }
  36. void tarjan(int u)
  37. {
  38. dfn[u]=low[u]=++tot;
  39. for(int i=h[u];i;i=e[i].ne)
  40. {
  41. if(dfn[e[i].to])
  42. low[u]=min(low[u],dfn[e[i].to]);
  43. else
  44. {
  45. tarjan(e[i].to);
  46. low[u]=min(low[u],low[e[i].to]);
  47. if(low[e[i].to]>=dfn[u])
  48. bl[u]++;
  49. }
  50. }
  51. }
  52. void tarjan2(int u)
  53. {
  54. dfn[u]=low[u]=++tot;
  55. s[++top]=u;
  56. for(int i=h[u];i;i=e[i].ne)
  57. {
  58. if(dfn[e[i].to])
  59. low[u]=min(low[u],dfn[e[i].to]);
  60. else
  61. {
  62. tarjan2(e[i].to);
  63. low[u]=min(low[u],low[e[i].to]);
  64. if(low[e[i].to]>=dfn[u])
  65. {
  66. int t,temp=0,size=0;
  67. do
  68. {
  69. t=s[top--];
  70. if(bl[t]>=2)
  71. ++temp;
  72. ++size;
  73. }
  74. while(t!=e[i].to);
  75. t=u;
  76. if(bl[t]>=2)
  77. ++temp;
  78. ++size;
  79. if(!temp)
  80. ans1+=2,ans2*=size*(size-1)/2;
  81. else if(temp==1)
  82. ans1++,ans2*=size-1;
  83. }
  84. }
  85. }
  86. }
  87. int main()
  88. {
  89. while(1)
  90. {
  91. m=read();
  92. if(!m)
  93. break;
  94. memset(h,0,sizeof(h));
  95. memset(dfn,0,sizeof(dfn));
  96. memset(bl,0,sizeof(bl));
  97. cnt=1;n=0;ans1=0;ans2=1;
  98. for(int i=1;i<=m;i++)
  99. {
  100. int x=read(),y=read();
  101. n=max(n,max(x,y));
  102. add(x,y),add(y,x);
  103. }
  104. for(int i=1;i<=n;i++)
  105. if(!dfn[i])
  106. tarjan(i);
  107. else
  108. bl[i]++;
  109. memset(dfn,0,sizeof(dfn));
  110. for(int i=1;i<=n;i++)
  111. if(!dfn[i])
  112. tarjan2(i);
  113. printf("Case %d: %d %lld\n",++cas,ans1,ans2);
  114. }
  115. return 0;
  116. }

bzoj 2730: [HNOI2012]矿场搭建【tarjan】的更多相关文章

  1. BZOJ 2730: [HNOI2012]矿场搭建( tarjan )

    先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...

  2. bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双

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

  3. 【刷题】BZOJ 2730 [HNOI2012]矿场搭建

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

  4. bzoj 2730: [HNOI2012]矿场搭建

    #include<cstdio> #include<cstring> #include<iostream> #define M 508 using namespac ...

  5. 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】

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

  6. 【BZOJ2730】[HNOI2012]矿场搭建 Tarjan

    [BZOJ2730][HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处. ...

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

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

  8. P3225 [HNOI2012]矿场搭建 tarjan割点

    这个题需要发现一点规律,就是先按割点求块,然后求每个联通块中有几个割点,假如没有割点,则需要建两个出口,如果一个割点,则需要建一个出口,2个以上不用建. 题干: 题目描述 煤矿工地可以看成是由隧道连接 ...

  9. 【BZOJ-2730】矿场搭建 Tarjan 双连通分量

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

随机推荐

  1. Java异常使用要点记录

    近期有离职的想法,奈何简历过于寒碜,技术懂的少,基础也薄弱,想要提升自己却不知从哪里入手.在郁闷一段时间后偶然间看到一篇博客,博主说出了许多人的心声,同时也指出了切入点,的确基础才是重点,是时候沉迷学 ...

  2. *lucene索引_创建_域选项

    [索引建立步骤] [创建Directory] [创建writer] [创建文档并添加索引] 文档和域的概念很重要 文档相当于表中的每一条记录,域相当于表中的每一个字段. [查询索引的基本信息] 使用I ...

  3. POJ-1028Web Navigation,大水题坑我3遍

    Web Navigation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32963   Accepted: 14704 ...

  4. [bzoj1978][BeiJing2010]取数游戏 game_动态规划_质因数分解

    取数游戏 game bzoj-1978 BeiJing-2010 题目大意:给定一个$n$个数的$a$序列,要求取出$k$个数.假设目前取出的数是$a_j$,那么下次取出的$a_k$必须保证:$j&l ...

  5. JVM(四):深入分析Java字节码-下

    JVM(四):深入分析Java字节码-下 在上文中,我们讲解了 Class 文件中的文件标识,常量池等内容.在本文中,我们就详细说一下剩下的指令集内容,阐述其分别代表了什么含义,以及 JVM 团队这样 ...

  6. sql语句执行的很慢

    一个 SQL 执行的很慢,我们要分两种情况讨论: 1.大多数情况下很正常,偶尔很慢,则有如下原因 (1).数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘. (2).执行的时候,遇到锁, ...

  7. 洛谷 P1065 作业调度方案

    P1065 作业调度方案 题目描述 我们现在要利用 mm 台机器加工 nn 个工件,每个工件都有 mm 道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每 ...

  8. Ubuntu 16.04安装磁盘占用分析器:ncdu

    使用此工具能分析出哪个文件或者文件夹有多大,从而实现自己手动删除. 安装: sudo apt-get install ncdu 使用: #默认搜索当前用户目录 ncdu #搜索整个硬盘 ncdu /

  9. mssql存储过程异常处理

    MSSQL2000和MSSQL2005以上版本的异常处理语法是不相同的. SQL Server 2005以上版本支持结构化异常处理,而MSSQL2000是不支持的. 1)先看MSSQL 2000的异常 ...

  10. iOS 自己主动释放手动释放混编

    当项目为手动释放时,Build Settings中,Objective-c Automatic Reference Conting 为YES 时,想要手动管理一些文件,在CompileSources中 ...