抄题解真开心

我真是越来越菜了

这是点双的板子题,于是求出所有点双,之后讨论

  1. 如果点双里之有一个割点,那么如果这个割点炸了,这个点双就出不去了,于是我们得在这个点双内部除了这个割点位置放一个

  2. 如果有两个割点,那么无论哪个割点炸了,这个点双都还有其他出口,于是不用放

  3. 没有割点,那么可能就是一个孤立的环,我们肯定得放一个在里面,但是如果放的位置炸了,这个环还是不和外部联通,于是只能再放一个以备不测

之后第二问用乘法原理就可以啦

代码

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<stack>
  5. #include<vector>
  6. #define re register
  7. #define maxn 505
  8. #define min(a,b) ((a)<(b)?(a):(b))
  9. #define max(a,b) ((a)>(b)?(a):(b))
  10. struct E
  11. {
  12. int u,v,nxt;
  13. }e[maxn<<1];
  14. int head[maxn];
  15. int n,num,m;
  16. std::vector<int> bcc[maxn];
  17. std::stack<int> st;
  18. int col[maxn],tot,cnt;
  19. int dfn[maxn],low[maxn];
  20. inline void add_edge(int x,int y)
  21. {
  22. e[++num].u=x,e[num].v=y;
  23. e[num].nxt=head[x],head[x]=num;
  24. }
  25. inline int read()
  26. {
  27. char c=getchar();
  28. int x=0;
  29. while(c<'0'||c>'9') c=getchar();
  30. while(c>='0'&&c<='9')
  31. x=(x<<3)+(x<<1)+c-48,c=getchar();
  32. return x;
  33. }
  34. int now;
  35. int cut[maxn];
  36. void tarjan(int x,int fa)
  37. {
  38. int sz=0;
  39. dfn[x]=low[x]=++cnt;
  40. for(re int i=head[x];i;i=e[i].nxt)
  41. if(!dfn[e[i].v])
  42. {
  43. sz++;
  44. st.push(i);
  45. tarjan(e[i].v,x);
  46. if(low[e[i].v]<low[x]) low[x]=low[e[i].v];
  47. if(low[e[i].v]>=dfn[x])
  48. {
  49. cut[x]=1;
  50. bcc[++tot].clear();
  51. for(;;)
  52. {
  53. int k=st.top();
  54. st.pop();
  55. if(col[e[k].u]!=tot) bcc[tot].push_back(e[k].u),col[e[k].u]=tot;
  56. if(col[e[k].v]!=tot) bcc[tot].push_back(e[k].v),col[e[k].v]=tot;
  57. if(i==k) break;
  58. }
  59. }
  60. }else if(fa!=e[i].v&&dfn[e[i].v]<low[x]) low[x]=dfn[e[i].v],st.push(i);
  61. if(!fa&&sz<2) cut[x]=0;
  62. }
  63. inline int init()
  64. {
  65. now++;
  66. m=read(),n=0;
  67. if(!m) return 0;
  68. int x,y;
  69. memset(head,0,sizeof(head));
  70. num=0;
  71. for(re int i=1;i<=m;i++)
  72. x=read(),y=read(),add_edge(x,y),add_edge(y,x),n=max(n,max(x,y));
  73. memset(dfn,0,sizeof(dfn)),memset(low,0,sizeof(low));
  74. cnt=0,tot=0;
  75. memset(col,0,sizeof(col)),memset(cut,0,sizeof(cut));
  76. for(re int i=1;i<=n;i++)
  77. if(!dfn[i]) tarjan(i,0);
  78. int ans=0;
  79. long long total=1;
  80. for(re int i=1;i<=tot;i++)
  81. {
  82. int t=0,k=0;
  83. for(std::vector<int>::iterator j=bcc[i].begin();j!=bcc[i].end();++j)
  84. {
  85. t++;
  86. if(cut[*j]) k++;
  87. }
  88. if(k==1) ans++,total*=(long long)(t-1);
  89. if(!k) total*=(long long)(t-1)*t/2,ans+=2;
  90. }
  91. printf("Case %d: %d %lld",now,ans,total),putchar(10);
  92. return m;
  93. }
  94. int main()
  95. {
  96. while(init());
  97. return 0;
  98. }

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

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

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

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

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

  3. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

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

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

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

  5. Tarjan 点双+割点+DFS【洛谷P3225】 [HNOI2012]矿场搭建

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

  6. [luoguP3325][HNOI2012]矿场搭建

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

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

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

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

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

  9. BZOJ 2730:[HNOI2012]矿场搭建(割点+连通块)

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

  10. BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量

    BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路 ...

随机推荐

  1. spring 与 springmvc 的区别和定义

    前言:(内附 spring 下载地址,可以选择需要的版本,给有需要的朋友)补充一下基础知识,spring 的定义和 springmvc 的定义,来源于百度百科. spring 源码下载地址 https ...

  2. python-Django框架url分发实现返回时间

    1.创建Django工程 再newproject中选择Django工程,在Location中输入建立的项目文件夹名称,Application name中输入要建立的app名称后电机Create. 2. ...

  3. CSS(一)sytle

    一:CSS语法组成:  选择符 和声明(声明和声明之间用分号隔开)  声明部分:属性和属性值(用冒号链接)  语法:选择符{   属性1:属性值:   属性2:属性值:  } 所有的CSS语句都要放到 ...

  4. 关于html 中form表单的内标签和使用

    表单标记 1.普通文本框: <input type=”text” name=”名称” value=”值”;不写value默认为空/> 2.密码框:<input type=”passw ...

  5. BZOJ2187:fraction

    Sol 分情况讨论 \(\lfloor\frac{a}{b}\rfloor+1\le \lceil\frac{c}{d}\rceil-1\) 直接取 \(q=1,p=\lfloor\frac{a}{b ...

  6. css,js移动资源

    随着移动市场的逐步扩大及相关技术的日趋完善,对前端开发提出了新的岗位要求,在继承前人成果的基础上需要在新的历史条件下有新的创新.移动端的开发,虽然没有IE6众多问题的折磨,但是多平台,多设备的兼容,也 ...

  7. Angular入门教程一

    1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...

  8. vue-cli构建项目 npm run build后应该怎么运行在本地查看效果

    问题: 就是 bulid 打包后,想本地看看效果,本地看不了.... 网上看到一个....   具体更多在: http://www.dabaipm.cn/static/frontend/346.htm ...

  9. Mybatis学习第四天——Mybatis与Spring整合

    主要介绍mapper配置与mapper的扫描配置,使用dao层的配置这里不多说. 1.导包 1.1 Mybatis的jar包 1.2 Spring的jar包 1.3 Spring与Mybatis整合包 ...

  10. ViewDragHelper详解(侧滑栏)

    1.Drag拖拽:ViewDrag拖拽视图,拖拽控件:ViewDragHelper拖拽视图助手,拖拽操作类.利用ViewDragHelper类可以实现很多绚丽的效果,比如:拖拽删除,拖拽排序,侧滑栏等 ...