题目大意:给一个n个点的无向连通图,找出删除某个点后的连通块个数。

题目分析:统计一下每个节点属于几个双连通分量,若是割点,得到的便是答案,否则答案为1。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<stack>
  4. # include<vector>
  5. # include<cstring>
  6. # include<algorithm>
  7. using namespace std;
  8. # define REP(i,s,n) for(int i=s;i<n;++i)
  9. # define CL(a,b) memset(a,b,sizeof(a));
  10.  
  11. const int N=10005;
  12. struct Edge
  13. {
  14. int u,v;
  15. Edge(int _u,int _v):u(_u),v(_v){}
  16. bool operator < (const Edge &a) const {
  17. if(v==a.v) return u<a.u;
  18. return v>a.v;
  19. }
  20. };
  21. stack<Edge>S;
  22. vector<Edge>ans;
  23. vector<int>G[N],bcc[N];
  24. int n,m,dfs_cnt,bcc_cnt,bccno[N],pre[N],low[N],cnt[N],iscut[N];
  25.  
  26. void dfs(int u,int fa)
  27. {
  28. low[u]=pre[u]=++dfs_cnt;
  29. int child=0;
  30. REP(i,0,G[u].size()){
  31. int v=G[u][i];
  32. if(pre[v]==0){
  33. ++child;
  34. S.push(Edge(u,v));
  35. dfs(v,u);
  36. low[u]=min(low[u],low[v]);
  37. if(low[v]>=pre[u]){
  38. iscut[u]=1;
  39. bcc[++bcc_cnt].clear();
  40. while(1){
  41. Edge x=S.top();
  42. S.pop();
  43. if(bccno[x.u]!=bcc_cnt){
  44. bcc[bcc_cnt].push_back(x.u);
  45. bccno[x.u]=bcc_cnt;
  46. }if(bccno[x.v]!=bcc_cnt){
  47. bcc[bcc_cnt].push_back(x.v);
  48. bccno[x.v]=bcc_cnt;
  49. }
  50. if(x.u==u&&x.v==v) break;
  51. }
  52. }
  53. }else if(pre[v]<pre[u]&&v!=fa){
  54. S.push(Edge(u,v));
  55. low[u]=min(low[u],pre[v]);
  56. }
  57. }
  58. if(fa<0&&child==1) iscut[u]=0;
  59. }
  60.  
  61. void findBcc()
  62. {
  63. CL(bccno,0);
  64. CL(iscut,0);
  65. CL(pre,0);
  66. dfs_cnt=bcc_cnt=0;
  67. REP(i,0,n) if(!pre[i])
  68. dfs(i,-1);
  69. }
  70.  
  71. int main()
  72. {
  73. int a,b;
  74. while(scanf("%d%d",&n,&m)&&(n+m))
  75. {
  76. REP(i,0,n) G[i].clear();
  77. while(scanf("%d%d",&a,&b))
  78. {
  79. if(a==-1&&b==-1)
  80. break;
  81. G[a].push_back(b);
  82. G[b].push_back(a);
  83. }
  84. findBcc();
  85. ans.clear();
  86. CL(cnt,0);
  87. REP(i,1,bcc_cnt+1) REP(j,0,bcc[i].size()) ++cnt[bcc[i][j]];
  88. REP(i,0,n){
  89. if(iscut[i])
  90. ans.push_back(Edge(i,cnt[i]));
  91. else
  92. ans.push_back(Edge(i,1));
  93. }
  94. sort(ans.begin(),ans.end());
  95. REP(i,0,m) printf("%d %d\n",ans[i].u,ans[i].v);
  96. printf("\n");
  97. }
  98. return 0;
  99. }

  

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

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

    题意:在一个无向连通图上,求任意删除一个点,余下连通块的个数. 对于一个非割顶的点,删除之后,原图仍连通,即余下连通块个数为1:对于割顶,余下连通块个数>=2. 由于是用dfs查找双连通分量,树 ...

  2. UVA 10765 Doves and bombs

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

  3. UVA 10765 Doves and bombs 割点

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

  4. uva 10765 Doves and Bombs(割顶)

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

  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. 微信公众号JSAPI支付

    微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心-&g ...

  2. PHP实现创建一个文件

    方法一:file_put_content($filename,$content); function mk_document($filename,$content=''){ // var_dump(_ ...

  3. DevOps架构实践

    1. 场景 持续部署:业界没有统一明确地定义,简单理解为将集成结果部署到不同的环境供用户使用,并且立即反馈部署结果的实践,其中不同的环境包括:开发环境.测试环境.预发布环境.生产环境 持续部署两个核心 ...

  4. TabLayout与ViewPager同步后Tab的标题不显示

    一.概述 1.1 问题描述 TabLayout+ViewPager后,TabLayout的TabItem不显示的问题: 1.2 截图 二.结论 mTabs.setupWithViewPager(mVi ...

  5. hihocoder1478 水陆距离

    地址:http://hihocoder.com/problemset/problem/1478 题目: 水陆距离 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个 ...

  6. Java线程常用方法汇总

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  7. java内存回收

    java中引用类型 强引用 Persnon  p = new Person(); 当指向Person对象的引用计数为0时,Person对象才能被垃圾回收器回收. 软引用 SoftReference&l ...

  8. hibernate的面向对象查询的效率有多低?

    前言 老平台的查询速度很慢,需要进行优化(...说白了就是优化sql语句),老平台用的strus2+hibernate框架,查询基本都是使用的HSQL. 关于hsql HQL是Hibernate Qu ...

  9. MySQL-5.7 备份与恢复

    一.备份分类 按介质分类: 物理备份 指通过拷贝数据库文件方式完成备份,适用于数据库很大,数据重要且需要快速恢复的数据库. 逻辑备份 指通过备份数据库的逻辑结构和数据内容的方式完成备份,适用于数据库不 ...

  10. 20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART B

    20145314郑凯杰<信息安全系统设计基础>第9周学习总结 PART B 明确教材学习目标 注意每个系统调用的参数.返回值,会查帮助文档 阅读教材,完成课后练习(书中有参考答案),考核: ...