题意:在一个无向连通图上,求任意删除一个点,余下连通块的个数。

对于一个非割顶的点,删除之后,原图仍连通,即余下连通块个数为1;对于割顶,余下连通块个数>=2。

由于是用dfs查找双连通分量,树形结构是向下搜素,所以在dfs过程中不便于统计割顶所分连通分量的个数。换一个角度,通过在vector<int>bcc中保存各个双连通分量的点,统计各个点出现的次数即可。(除割顶外,每个点只可能出现一次)

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<stack>
  6. using namespace std;
  7.  
  8. const int MAXN= ;
  9.  
  10. struct Edge{
  11. int u,v;
  12. Edge(){}
  13. Edge(int _u,int _v):u(_u),v(_v){}
  14. };
  15.  
  16. struct Cut{
  17. int c,w;
  18. }cut[MAXN];
  19.  
  20. int iscut[MAXN],pre[MAXN],low[MAXN],dfs_clock,bcc_cnt,bccno[MAXN];
  21. int son;
  22. vector<int >G[MAXN],bcc[MAXN];
  23. stack<Edge>stk;
  24.  
  25. void dfs(int u,int fa)
  26. {
  27. pre[u]=low[u]=dfs_clock++;
  28. son=;
  29. for(int i=;i<G[u].size();i++)
  30. {
  31. int v=G[u][i];
  32. Edge e=Edge(u,v);
  33. if(!pre[v]){
  34. stk.push(e);
  35. son++;
  36. dfs(v,u);
  37. low[u]=min(low[u],low[v]);
  38. if(low[v]>=pre[u]){
  39. iscut[u]=;
  40. bcc_cnt++;
  41. bcc[bcc_cnt].clear();
  42. while()
  43. {
  44. Edge x=stk.top();
  45. stk.pop();
  46. if(bccno[x.u]!=bcc_cnt){
  47. bcc[bcc_cnt].push_back(x.u);
  48. bccno[x.u]=bcc_cnt;
  49. }
  50. if(bccno[x.v]!=bcc_cnt){
  51. bcc[bcc_cnt].push_back(x.v);
  52. bccno[x.v]=bcc_cnt;
  53. }
  54. if(x.u==u&&x.v==v)
  55. break;
  56. }
  57. }
  58. }else if(pre[v]<pre[u]&&v!=fa){
  59. stk.push(e);
  60. low[u]=min(low[u],pre[v]);
  61. }
  62. }
  63. if(fa==-&&son==)
  64. iscut[u]=;
  65. }
  66.  
  67. void find_bcc(int n)
  68. {
  69. bcc_cnt=dfs_clock=;
  70. memset(pre,,sizeof(pre));
  71. memset(bccno,,sizeof(bccno));
  72. memset(iscut,,sizeof(iscut));
  73. memset(cut,,sizeof(cut));
  74.  
  75. for(int i=;i<n;i++)
  76. if(!pre[i])
  77. dfs(i,-);
  78. }
  79.  
  80. int cmp(Cut a,Cut b)
  81. {
  82. if(a.w==b.w)
  83. return a.c<b.c;
  84. return a.w>b.w;
  85. }
  86.  
  87. int main()
  88. {
  89. int n,m,x,y;
  90. while(~scanf("%d%d",&n,&m))
  91. {
  92. if(!n&&!m)
  93. return ;
  94. for(int i=;i<n;i++)
  95. G[i].clear();
  96.  
  97. while()
  98. {
  99. scanf("%d%d",&x,&y);
  100. if(x==-&&y==-)
  101. break;
  102. G[x].push_back(y);
  103. G[y].push_back(x);
  104. }
  105.  
  106. find_bcc(n);
  107.  
  108. for(int i=;i<=bcc_cnt;i++)
  109. {
  110. for(int j=;j<bcc[i].size();j++)
  111. {
  112. cut[bcc[i][j]].c=bcc[i][j];
  113. cut[bcc[i][j]].w++;
  114. }
  115. }
  116. sort(cut,cut+n,cmp);
  117. for(int i=;i<m;i++)
  118. printf("%d %d\n",cut[i].c,cut[i].w);
  119. puts("");
  120. }
  121. return ;
  122. }

UVA 10765 Doves and bombs(双连通分量)的更多相关文章

  1. UVA 10765 Doves and bombs

    给定一个无向的连通图,要求每个点去掉后连通分量的数目,然后输出连通分量最多的m个点. 分析: 先求出双连通分量,然后统计所有双连通分量中割顶出现的次数,最后求出的就是割顶去掉后剩下的双连通的数目,对于 ...

  2. UVA 10765 Doves and bombs 割点

    最近好懒,堆了好多题没写题解.. 原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

  3. uva 10765 Doves and Bombs(割顶)

     题意:给定一个n个点的连通的无向图,一个点的"鸽子值"定义为将它从图中删去后连通块的个数.求每一个点的"鸽子值". 思路dfs检查每一个点是否为割顶,并标 ...

  4. UVA-10765 Doves and bombs (双连通分量)

    题目大意:给一个n个点的无向连通图,找出删除某个点后的连通块个数. 题目分析:统计一下每个节点属于几个双连通分量,若是割点,得到的便是答案,否则答案为1. 代码如下: # include<ios ...

  5. UVA 10972 - RevolC FaeLoN(边-双连通分量)

    UVA 10972 - RevolC FaeLoN option=com_onlinejudge&Itemid=8&page=show_problem&category=547 ...

  6. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  7. uva 10972(边双连通分量)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33804. 思路:和poj的一道题有点像,不过这道题图可能不连通,因 ...

  8. LA 3523 圆桌骑士(二分图染色+点双连通分量)

    https://vjudge.net/problem/UVALive-3523 题意: 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置 ...

  9. poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)

    #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #includ ...

随机推荐

  1. MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能

    MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能 由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQ ...

  2. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D. Little Artem and Dance

    题目链接: http://codeforces.com/contest/669/problem/D 题意: 给你一个初始序列:1,2,3,...,n. 现在有两种操作: 1.循环左移,循环右移. 2. ...

  3. jQuery+css+div--一些细节详解

    (一).首先.让我们认识一下最基本普通的alert()弹出框!(改变alert()提示弹出框的样式) 我们在写html或是jsp页面的时候,谁都不希望自己精心设计,且非常美观的页面颜色布局被破坏掉吧! ...

  4. Unity3d游戏中添加移动MM支付SDK问题处理

    原地址:http://www.tuicool.com/articles/I73QFb 由于移动mm的SDK将部分资源文件放在jar包中,导致Unity无法识别,提示failed to find res ...

  5. 使用mysql触发器脚本,解决流水数据的添加。

    1.建立表脚本 CREATE DATABASE `spring` DEFAULT CHARACTER SET utf8; USE `spring`; CREATE TABLE `account` ( ...

  6. solr4.5部署

    一.服务器部署 1.solr自带jetty服务器上部署 cd到solr-4.5.0\example目录下,运行java -jar start.jar即可运行jetty服务器.访问http://loca ...

  7. D&F学数据结构系列——插入排序

    插入排序(insertion sort) 插入排序由P-1趟(pass)排序组成.对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P-1上的元素为已排序状态.插入排序利用了这样的事实:位置0到位 ...

  8. **CI两种方式查询所返回的结果数量

    区别:第一个是有条件的:第二个没有条件 $this->db->count_all_results(); 允许你获得某个特定的Active Record查询所返回的结果数量.可以使用Acti ...

  9. POJ2418Hardwood Species

    题意 : 输入若干个树木品种,里边有的是重复的,让你统计每个品种占输入的总数量的百分比,最后按字典序输出 思路 : 本题数量很大,所以采用直接统计的方式会超时,而采用的方法可以用二叉搜索树,或者用ma ...

  10. ZOJ 2563 Long Dominoes(状压DP)

    给定一个m*n的方格子,要求用3*1的骨牌去覆盖,骨牌可以用横放或者竖放,问最终有多少种放置方式,将其铺满. 分析:由于最多30行,每行最多9列,所以可以按行来dp,设计每行的状态从而进行转移,考虑每 ...