Tarjan算法。

1.若u为根,且度大于1,则为割点

2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边)

3.若low[v]>dfn[u],则边(u,v)为桥(封死在子树内),不操作。

求割点时,枚举所有与当前点u相连的点v:

1.是重边: 忽略

2.是树边: Tarjan(v),更新low[u]=min(low[u],low[v]); 子树个数cnt+1.如果low[v] >= dfn[u],说明是割点,割点数+1

3.是回边: 更新low[u] = min(low[u],dfn[v]),因为此时v是u的祖先。

关于Tarjan求割点可见:http://hi.baidu.com/lydrainbowcat/item/f8a5ac223e092b52c28d591c

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <vector>
  7. #define Mod 1000000007
  8. using namespace std;
  9. #define N 10007
  10.  
  11. vector<int> G[N];
  12. struct CUT
  13. {
  14. int v,num;
  15. }cut[N];
  16. int vis[N],dfn[N],low[N],Time;
  17. int n,m,k;
  18.  
  19. int cmp(CUT ka,CUT kb)
  20. {
  21. if(ka.num == kb.num)
  22. return ka.v < kb.v;
  23. return ka.num > kb.num;
  24. }
  25.  
  26. void Tarjan(int u,int fa)
  27. {
  28. low[u] = dfn[u] = ++Time;
  29. int cnt = ;
  30. vis[u] = ;
  31. int flag = ;
  32. for(int i=;i<G[u].size();i++)
  33. {
  34. int v = G[u][i];
  35. if(v == fa && flag) //重边
  36. {
  37. flag = ;
  38. continue;
  39. }
  40. if(!vis[v]) //树边
  41. {
  42. Tarjan(v,u);
  43. cnt++;
  44. low[u] = min(low[u],low[v]);
  45. if(low[v] >= dfn[u])
  46. cut[u].num++;
  47. }
  48. else if(vis[v] == ) //回边
  49. low[u] = min(low[u],dfn[v]);
  50. }
  51. if(fa == - && cnt == ) //为根且度数为1,不是割点
  52. cut[u].num = ;
  53. vis[u] = ;
  54. return;
  55. }
  56.  
  57. int main()
  58. {
  59. int i,j,u,v;
  60. while(scanf("%d%d%d",&n,&m,&k)!=EOF)
  61. {
  62. Time = ;
  63. for(i=;i<=n;i++)
  64. {
  65. G[i].clear();
  66. cut[i].v = i;
  67. cut[i].num = ;
  68. }
  69. cut[].num = ; //根要特判
  70. while(m--)
  71. {
  72. scanf("%d%d",&u,&v);
  73. G[u].push_back(v);
  74. G[v].push_back(u);
  75. }
  76. memset(dfn,,sizeof(dfn));
  77. memset(low,,sizeof(low));
  78. memset(vis,,sizeof(vis));
  79. Tarjan(,-);
  80. sort(cut,cut+n,cmp);
  81. for(i=;i<k;i++)
  82. printf("%d %d\n",cut[i].v,cut[i].num);
  83. printf("\n");
  84. }
  85. return ;
  86. }

UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数的更多相关文章

  1. UESTC - 900 方老师炸弹 —— 割点

    题目链接:https://vjudge.net/problem/UESTC-900   方老师炸弹 Time Limit: 4000/2000MS (Java/Others)     Memory L ...

  2. poj1523求割点以及割后连通分量数tarjan算法应用

    无向图,双向通道即可,tarjan算法简单应用.点u是割点,条件1:u是dfs树根,则u至少有2个孩子结点.||条件2:u不是根,dfn[u]=<low[v],v是u的孩子结点,而且每个这样的v ...

  3. POJ 1144 Network(Tarjan求割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

  4. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  5. poj_1144Network(tarjan求割点)

    poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...

  6. 洛谷P3388 【模板】割点(割顶)(tarjan求割点)

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  7. [POJ1144][BZOJ2730]tarjan求割点

    求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...

  8. poj1144 tarjan求割点

    poj1144 tarjan求割点 额,算法没什么好说的,只是这道题的读入非常恶心. 注意,当前点x是否是割点,与low[x]无关,只和low[son]和dfn[x]有关. 还有,默代码的时候记住分目 ...

  9. tarjan求割点割边的思考

    这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...

随机推荐

  1. (HY000): Cannot modify @@session.sql_log_bin inside a transaction

    昨天,线上发生一例(HY000): Cannot modify @@session.sql_log_bin inside a transaction代码缺少显示的start transaction控制 ...

  2. [Angularjs]视图和路由(四)

    写在前面 关于angularjs的路由的概念基本上这篇就要结束了,通过学习,以及在实际项目中的实践,还是比较容易上手的.自己也通过angularjs做了一个在app上的一个模块,效果还是可以的. 系列 ...

  3. FME2014汉化问题

    问题:FME2014汉化包安装上不起作用,安装环境是是Win7 64位,FME是64位版本的,默认位置在Program Files\FME下,而汉化包安装默认位置在Program Files (x86 ...

  4. WCF概念

    WCF 概念 WCF是.NET Framework 上灵活通讯技术.在.NET 3.0推出之前,一个企业解决方案需要几种通讯方式.对于独立于平台的通讯,使用ASP.NET Web服务.对于比较高级的 ...

  5. JS常用的三种匿名函数

    第一种: var f1=function(p1,p2){ return p1+p2; };//将函数赋值给一个变量 alert(f1(1,3)); 匿名函数没法调用,只能赋值给一个变量,由于是赋值语句 ...

  6. Error occurred in deployment step 'Add Solution': Operation is not valid due to the current state of the object.

    Sharepoint 部署的时候出现一个错误 Error occurred in deployment step 'Add Solution': Operation is not valid due ...

  7. Upgrading or Redeploying SharePoint 2010 Workflows

    While creating several State Machine SharePoint 2010 workflows using visual studio for a client I ha ...

  8. android 保存 用户名和密码 设置等应用信息优化

    1.传统的保存用户名,密码方式 SharedPreferences Editor editor = shareReference.edit(); editor.putString(KEY_NAME,& ...

  9. C++map类型

    map是键-值对的集合,可以理解为关联数组,可以使用键作为下标来获取一个值 本文地址:http://www.cnblogs.com/archimedes/p/cpp-map.html,转载请注明源地址 ...

  10. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...