poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数

题目大意:如题目所示

给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量),所以我们利用tarjan算法,求取一个联通分量的点,记录次数,因为访问几次,就代表这个点的不同方向上的联通分量的个数,记录下来,最后输出即可

至于根节点的选取,选谁都没什么问题的,我默认选的节点1

嗯,没什么了,tarjan算法到这算是入门啦

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string.h>
  4. using namespace std;
  5. const int maxn = 1e3 + 10;
  6. struct node{
  7. int to,pre;
  8. }e[maxn * 2];
  9. int id[maxn],cnt;
  10. int index;
  11. int root;
  12. int dfn[maxn],low[maxn];
  13. int subnets[maxn];
  14. int flag;
  15. int p_cnt;
  16. void init()
  17. {
  18. memset(dfn,0,sizeof(dfn));
  19. memset(low,0,sizeof(low));
  20. memset(subnets,0,sizeof(subnets));
  21. memset(id,-1,sizeof(id));
  22. index = 0;
  23. flag = 0;
  24. cnt = 0;
  25. p_cnt = 0;
  26. }
  27. void add(int u,int v)
  28. {
  29. e[cnt].to = v;
  30. e[cnt].pre = id[u];
  31. id[u] = cnt++;
  32. p_cnt = max(max(u,v),p_cnt);
  33. }
  34.  
  35. void tarjan(int u,int pre)
  36. {
  37. int son = 0;
  38. dfn[u] = low[u] = ++index;
  39. for(int i = id[u];~i;i = e[i].pre)
  40. {
  41. int v = e[i].to;
  42. if(!dfn[v])
  43. {
  44. tarjan(v,u);
  45. son++;
  46. low[u] = min(low[v],low[u]);
  47.  
  48. if(u == root && son > 1)
  49. {
  50. flag = 1;
  51. subnets[u]++;//发现一个
  52. }
  53. if(u != root && low[v] >= dfn[u])
  54. {
  55. subnets[u]++;//发现一个连通分量
  56. flag = 1;
  57. }
  58. }
  59. else if(v != pre)
  60. {
  61. low[u] = min(low[u],dfn[v]);
  62. }
  63. }
  64. }
  65. int main()
  66. {
  67. int cas = 0;
  68. while(true)
  69. {
  70. int u,v = -1;
  71. init();
  72. while(scanf("%d",&u),u)
  73. {
  74. scanf("%d",&v);
  75. add(u,v);
  76. add(v,u);
  77. }
  78. if(v == -1)break;
  79. root = 1;
  80. tarjan(root,-1);
  81.  
  82. printf("Network #%d\n",++cas);
  83. if(flag)
  84. {
  85. for(int i = 1;i <= p_cnt;i++)
  86. {
  87. if(subnets[i] > 0)
  88. {
  89. printf(" SPF node %d leaves %d subnets\n",i,subnets[i]+1);//加上fa->u该边所连接的连通分量
  90. }
  91. }
  92. }
  93. else
  94. {
  95. printf(" No SPF nodes\n");
  96. }
  97. printf("\n");
  98. }
  99. return 0;
  100. }

poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数的更多相关文章

  1. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)

    基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...

  2. SPF Tarjan算法求无向图割点(关节点)入门题

    SPF 题目抽象,给出一个连通图的一些边,求关节点.以及每个关节点分出的连通分量的个数 邻接矩阵只要16ms,而邻接表却要32ms,  花费了大量的时间在加边上. //   time  16ms 1 ...

  3. K:求取数组中最大连续子序列和的四个算法

    相关介绍:  求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有 ...

  4. Tarjan算法初探(3):求割点与桥以及双连通分量

    接上一节Tarjan算法初探(2):缩点 在此首先提出几个概念: 割点集合:一个无向连通图G 若删除它的一个点集 以及点集中所有点相连的边(任意一端在点集中)后 G中有点之间不再连通则称这个点集是它的 ...

  5. POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)

    题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...

  6. OpenCV 最小二乘拟合方法求取直线倾角

    工业相机拍摄的图像中,由于摄像质量的限制,图像中的直线经过处理后,会表现出比较严重的锯齿.在这种情况下求取直线的倾角(其实就是直线的斜率),如果是直接选取直线的开始点和结束点来计算,或是用opencv ...

  7. POJ 2299树状数组求逆序对

    求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法.在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到99 ...

  8. 算法笔记_042:求最小公倍数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最小公倍数?能同时被数字m和数字n整除的最小整数.例如,24和60的最小公倍数等于120.下面请编写相关函数实现求取数字m和n的最小公倍数. 2 ...

  9. tarjan求割边割点

    tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...

随机推荐

  1. andorid 练习微信登陆

    AndroidManifest.xml layout1.xml <?xml version="1.0" encoding="utf-8"?> < ...

  2. swift 中使用weak self

    request.responseString(encoding: NSUTF8StringEncoding) {[weak self] (res) -> Void in if let stron ...

  3. MySQL 检索数据及提高检索速度的方法

    检索数据 mysql> SELECT [DISTINCT] 表名.列名,表名.列名,表名.列名 -- 使用通配符*表示所有列 DISTINCT表示返回不同的值 -> FROM 数据库名.表 ...

  4. How to use external classes and PHP files in Laravel Controller?

    By: Povilas Korop Laravel is an MVC framework with its own folder structure, but sometimes we want t ...

  5. 句子相似度_tf/idf

    import mathfrom math import isnanimport pandas as pd#结巴分词,切开之后,有分隔符def jieba_function(sent): import ...

  6. Elastix GOIP 网关配合

    方案一 Gateway disallow=allallow=alaw&ulawcanreinvite=nodtmfmode=rfc2833host=192.168.1.108insecure= ...

  7. ContextMune上下文菜单中,二级菜单获取及状态设置

    ContextMune上下文菜单中,二级菜单获取及状态设置 在使用ContextMune上下文菜单中,能够通过二级菜单来获取及状态设置 //二级菜单获取和状态设置((ToolStripDropDown ...

  8. python的数字图像处理学习(2)

    图像的重定义大小,图像的缩扩,图像的旋转: from skimage import transform,data import matplotlib.pyplot as plt img = data. ...

  9. unity3DGI

    Realtime GI,实时全局光照, 1.构成 : 可实时更新的lightmap + 可实时更新的光照探头(light probe)+ 可实时更新的cubemap(Reflection probe) ...

  10. oracle merge into语法

    oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入 不需要先去判断一下记录是否存在,直接使用merge into oerge into 语法: MERGE ...