题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点。任意两个连接点之间最多只有一条隧道。任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱,求最少安装数量和方案。

思路:其实本题就相当于在一张无向图中,涂尽量少的黑点,使得任意删除哪个点,每个连通分量至少有一个黑点。因为不同的连通分量最多只有一个公共点,那一定是割点。可以发现,涂黑割点是不划算的,而且在 一个点-双连通分量中涂黑两个黑点也是不划算的。所以只有当点-双连通分量只有一个割点时,才需要涂,而且是任选一个非割点涂黑。

2011年final题,想法不是很好明白,联系实际再YY一下就懂了

  1. //struct ID 用来减小数字的,有点离散的作用。但是注释掉以后运行时间简短,AC
  2. #include<cstdio>
  3. #include<stack>
  4. #include<vector>
  5. #include<map>
  6. #include<algorithm>
  7. #include<cstring>
  8. using namespace std;
  9. typedef long long LL;
  10.  
  11. struct Edge {
  12. int u, v;
  13. };
  14.  
  15. const int maxn = + ;
  16. int pre[maxn], iscut[maxn], bccno[maxn], dfs_clock, bcc_cnt; // 割顶的bccno无意义
  17. vector<int> G[maxn], bcc[maxn];
  18.  
  19. stack<Edge> S;
  20.  
  21. int dfs(int u, int fa) {
  22. int lowu = pre[u] = ++dfs_clock;
  23. int child = ;
  24. for(int i = ; i < G[u].size(); i++) {
  25. int v = G[u][i];
  26. Edge e = (Edge) {
  27. u, v
  28. };
  29. if(!pre[v]) { // 没有访问过v
  30. S.push(e);
  31. child++;
  32. int lowv = dfs(v, u);
  33. lowu = min(lowu, lowv); // 用后代的low函数更新自己
  34. if(lowv >= pre[u]) {
  35. iscut[u] = true;
  36. bcc_cnt++;
  37. bcc[bcc_cnt].clear();
  38. for(;;) {
  39. Edge x = S.top();
  40. S.pop();
  41. if(bccno[x.u] != bcc_cnt) {
  42. bcc[bcc_cnt].push_back(x.u);
  43. bccno[x.u] = bcc_cnt;
  44. }
  45. if(bccno[x.v] != bcc_cnt) {
  46. bcc[bcc_cnt].push_back(x.v);
  47. bccno[x.v] = bcc_cnt;
  48. }
  49. if(x.u == u && x.v == v) break;
  50. }
  51. }
  52. } else if(pre[v] < pre[u] && v != fa) {
  53. S.push(e);
  54. lowu = min(lowu, pre[v]); // 用反向边更新自己
  55. }
  56. }
  57. if(fa < && child == ) iscut[u] = ;
  58. return lowu;
  59. }
  60.  
  61. //struct ID {
  62. // map<int, int> m;
  63. // int cnt;
  64. // ID():cnt(0) { }
  65. // int get(int x) {
  66. // if(!m.count(x)) m[x] = cnt++;
  67. // return m[x];
  68. // }
  69. //};
  70.  
  71. int main() {
  72. int kase = , n;
  73. while(scanf("%d", &n) == && n) {
  74. memset(pre, , sizeof(pre));
  75. memset(iscut, , sizeof(iscut));
  76. memset(bccno, , sizeof(bccno));
  77. for(int i = ; i < n*; i++) G[i].clear();
  78. dfs_clock = bcc_cnt = ;
  79.  
  80. // ID id;
  81. for(int i = ; i < n; i++) {
  82. int u, v;
  83. scanf("%d%d", &u, &v);
  84. // u = id.get(u);
  85. // v = id.get(v);
  86. u--;
  87. v--;
  88. G[u].push_back(v);
  89. G[v].push_back(u);
  90. }
  91. dfs(, -); // 调用结束后S保证为空,所以不用清空
  92.  
  93. LL ans1 = , ans2 = ;
  94. for(int i = ; i <= bcc_cnt; i++) {
  95. int cut_cnt = ;
  96. for(int j = ; j < bcc[i].size(); j++)
  97. if(iscut[bcc[i][j]]) cut_cnt++;
  98. if(cut_cnt == ) {
  99. ans1++;
  100. ans2 *= (LL)(bcc[i].size() - cut_cnt);
  101. }
  102. }
  103. if(bcc_cnt == ) {
  104. ans1 = ;
  105. ans2 = bcc[].size() * (bcc[].size() - ) / ;
  106. }
  107. printf("Case %d: %lld %lld\n", ++kase, ans1, ans2);
  108. }
  109. return ;
  110. }

UVALive 5135 Mining Your Own Business 双连通分量 2011final的更多相关文章

  1. UVALive 5135 Mining Your Own Business 双连通分量

    据说这是一道Word Final的题,Orz... 原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...

  2. UVALive - 5135 - Mining Your Own Business(双连通分量+思维)

    Problem   UVALive - 5135 - Mining Your Own Business Time Limit: 5000 mSec Problem Description John D ...

  3. UVALive - 5135 Mining Your Own Business

    刘汝佳白书上面的一道题目:题意是给定一个联通分量,求出割顶以及双连通分量的个数,并且要求出安放安全井的种类数,也就是每个双连通分量中结点数(除开 割顶)个数相乘,对于有2个及以上割顶的双连通分量可以不 ...

  4. LA 5135 井下矿工(点—双连通分量模板题)

    https://vjudge.net/problem/UVALive-5135 题意:在一个无向图上选择尽量少的点涂黑,使得任意删除一个点后,每个连通分量至少有一个黑点. 思路: 首先dfs遍历求出割 ...

  5. 【LA】5135 Mining Your Own Business

    [算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...

  6. UVALive 5135 Mining Your Own Bussiness【tarjan点双】

    LINK1 LINK2 题目大意 给你一个无向连通图,让你给一些点染上黑色,需要满足染色之后,断开任意一个节点,要满足任意一个联通块中剩下的节点中至少有一个黑点 思路 一开始想的是把每一个点双联通分量 ...

  7. LA 5135 Mining Your Own Business

    求出 bcc 后再……根据大白书上的思路即可. 然后我用的是自定义的 stack 类模板: #include<cstdio> #include<cstring> #includ ...

  8. 训练指南 UVALive - 5135 (双连通分量)

    layout: post title: 训练指南 UVALive - 5135 (双连通分量) author: "luowentaoaa" catalog: true mathja ...

  9. hdu3844 Mining Your Own Business,无向双连接组件

    点击打开链接 无向图的双连通分量 #include<cstdio> #include<stack> #include<vector> #include<map ...

随机推荐

  1. IE 6/7下自赋值导致 overflow 溢出

    情景是要限制一个textarea的最大输入字数(100字,  这字数限制也太少了点吧,不大气) 由于限制输入后需要允许 回退,全选等功能键,故放弃keyup, keydown组合 选用property ...

  2. jdbc 连接Oracle informix Mysql

    package com.basicSql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...

  3. python 脚本

    mag3.py 1,import import sys from org.eclipse.jface.dialogs import MessageDialogfrom org.eclipse.core ...

  4. CoreBluetooth - TouchID应用

    支持系统和机型: iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8, 虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论 ...

  5. Oracle常用查看表结构命令

    获取表: select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select ...

  6. LFI & RFI & PHP封装协议之安全问题研究

    目录 . 文件包含的基本概念 . LFI(Local File Include) . RFI(Remote File Include) . PHP中的封装协议(伪协议).PHP的流式文件操作模式所带来 ...

  7. HDU 2370 Convert Kilometers to Miles

    点我看题目 题意 : 按照题目给定的规则将公里转化成英里,就是每个数都可以用斐波那契数列里的数表示,每个数都有一个编码,21可以表示成(1,0,0,0,0,0,0) ,13可以表示成(1,0,0,0, ...

  8. [杂题]CSUOJ1274Balls and Boxes

    题目链接 题意:中文题 题意不多赘述 值得注意的是n<m 不必考虑n==m的情况 (m是盒子个数, n是每次选取的盒子个数, 不要弄反了!) 这题一看就是同余方程 每次选取n个盒子放球 也就是说 ...

  9. Android笔记5-与USB HID 设备通信(一)

    1.了解 支持USB 主机(host)或者从机(accessary )模式最终是取决于设备的硬件,而与平台版本无关.我们可以通过usesfeature这个方法来查询自己的设备是否支持USB主从.   ...

  10. C# ASP.NET FILEUPLOAD详解

    显示一个文本框控件和一个浏览按钮,使用户可以选择要上载到服务器的文件. 命名空间: System.Web.UI.WebControls 程序集: System.Web(在 system.web.dll ...