题目链接:http://poj.org/problem?id=1523

SPF:A Single Point of Failure也就是割点(一个点导致网络之间的不连通),由于给出的图是无向图,所以只要连通就一定强连通。要求连通分支的数量就是要求请联通分支的数量,我们可想到tarjan求强连通的步骤,只要一群结点的low值相同他们就是属于同一个SCC(Strongly Connected Component),所以我们只要对于每一个割点,记录一下这个点所到的其他结点的不相同的low值的数量,就是这个点能够将网络分成的连通分支的数量。因为在dfs树上,如果一个根结点是割点的话,对于他的每一个子节点,我们进行一次深搜(没访问过的),并且标记访问,表上记号,等到所有的子结点全部搜完就记号的数量就是强连通分量的个数。

代码如下:

  1. #include<cstdio>
  2. #include<string.h>
  3. #include<set>
  4. #include<iostream>
  5. using namespace std;
  6. const int maxn =1e3+;
  7. int head[maxn],nxt[maxn],iscut[maxn],dfn[maxn],low[maxn];
  8. bool vis[maxn];
  9. struct node{
  10. int u,v;
  11. }p[maxn];
  12. int e;
  13. int n,cnt;
  14. void addedge(int u,int v)
  15. {
  16. p[e].u=u;
  17. p[e].v=v;
  18. nxt[e]=head[u];
  19. head[u]=e++;
  20. }
  21. void tarjan(int u,int fa)
  22. {
  23. dfn[u]=low[u]=++cnt;//dfn为dfs时间戳,low为回退边指向的最小祖先
  24. int child=;
  25. for(int i=head[u];~i;i=nxt[i])
  26. {
  27. int v=p[i].v;
  28. if(!dfn[v])
  29. {
  30. tarjan(v,u);
  31. low[u]=min(low[u],low[v]);
  32. child++;
  33. if(u!=&&low[v]>=dfn[u])iscut[u]=;
  34. }
  35. else if(dfn[v]<dfn[u]&&v!=fa)//回退边
  36. {
  37. low[u]=min(low[u],dfn[v]);
  38. }
  39. }
  40. if(u==&&child>=)iscut[]=;
  41. }
  42. int main()
  43. {
  44. int x,y;
  45. int step=;
  46. while(scanf("%d",&x)&&x)
  47. {
  48. scanf("%d",&y);
  49. n=;
  50. memset(head,-,sizeof(head));
  51. memset(nxt,-,sizeof(nxt));
  52. memset(dfn,,sizeof(dfn));
  53. memset(low,,sizeof(low));
  54. memset(iscut,,sizeof(iscut));
  55. memset(vis,,sizeof(vis));
  56. cnt=;
  57. e=;
  58. n=max(max(x,y),n);
  59. addedge(x,y);addedge(y,x);
  60. while(scanf("%d",&x)&&x)
  61. {
  62. scanf("%d",&y);
  63. n=max(max(x,y),n);
  64. addedge(x,y);addedge(y,x);
  65. }
  66. tarjan(,-);//从结点一开始建立dfs树
  67. set<int> s;
  68. bool flag=false;
  69. printf("Network #%d\n",++step);
  70. for(int i=;i<=n;i++)
  71. {
  72. s.clear();
  73. if(iscut[i])//对于每一个割点查找连通分量的数量
  74. {
  75. flag=true;
  76. for(int j=head[i];~j;j=nxt[j])
  77. {
  78. s.insert(low[p[j].v]);//搜索不同的low值数量
  79. }
  80. }
  81. if(s.size())
  82. printf(" SPF node %d leaves %d subnets\n",i,s.size());
  83. }
  84. if(!flag)printf(" No SPF nodes\n");
  85. printf("\n");
  86. }
  87. }

POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量的更多相关文章

  1. HDU5739-Fantasia(tarjan求割点)

    题意:给一个无向图n个点1~n,m条边,sigma(i*zi)%(1e9+7).zi是这个图删掉i点之后的价值.一个图的价值是所有连通子图的价值之和,连通图的价值是每个点的乘积. 题解:讲道理这题不算 ...

  2. BZOJ 2730 矿场搭建 Tarjan求割点

    思路: Tarjan求出来点双&割点 判一判就行了 //By SiriusRen #include <stack> #include <cstdio> #include ...

  3. tarjan算法-解决有向图中求强连通分量的利器

    小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...

  4. Tarjan算法初探 (1):Tarjan如何求有向图的强连通分量

    在此大概讲一下初学Tarjan算法的领悟( QwQ) Tarjan算法 是图论的非常经典的算法 可以用来寻找有向图中的强连通分量 与此同时也可以通过寻找图中的强连通分量来进行缩点 首先给出强连通分量的 ...

  5. [学习笔记] Tarjan算法求强连通分量

    今天,我们要探讨的就是--Tarjan算法. Tarjan算法的主要作用便是求一张无向图中的强连通分量,并且用它缩点,把原本一个杂乱无章的有向图转化为一张DAG(有向无环图),以便解决之后的问题. 首 ...

  6. POJ2186 Popular Cows 强连通分量tarjan

    做这题主要是为了学习一下tarjan的强连通分量,因为包括桥,双连通分量,强连通分量很多的求法其实都可以源于tarjan的这种方法,通过一个low,pre数组求出来. 题意:给你许多的A->B ...

  7. 算法模板——Tarjan强连通分量

    功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有 ...

  8. tarjan算法强连通分量的正确性解释+错误更新方法的解释!!!+hdu1269

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 以下内容为原创,转载请声明. 强连通分量SCC(Strongly Connected Compo ...

  9. 强连通分量的Tarjan算法

    资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tar ...

随机推荐

  1. windows 下 基于express搭建 https协议的网站

    参考 https://blog.csdn.net/xingyanchao/article/details/79362443 问题在于生成SSL证书的时候Windows环境下会报错 解决方案 参考 ht ...

  2. SpringMVC之添加照片并修改照片名字

    @RequestMapping(value="/addIdcardsSubmit",method={RequestMethod.POST,RequestMethod.GET}) p ...

  3. 参考C# 使用 System.Web.Script.Serialization 解析 JSON

    参考C# 使用 System.Web.Script.Serialization 解析 JSON 使用json需要引用到System.Web.Script.Serialization.习惯在解决方案右键 ...

  4. 字符串匹配算法 之BF、KMP

    示例: 1. 已知字符串str1="acabaabaabcacaabc",求str2="abaabcac"是否在字符串str1中? 2. DNA病毒检测.已知患 ...

  5. Angular 1 深度解析:脏数据检查与 angular 性能优化

    TL;DR 脏检查是一种模型到视图的数据映射机制,由 $apply 或 $digest 触发. 脏检查的范围是整个页面,不受区域或组件划分影响 使用尽量简单的绑定表达式提升脏检查执行速度 尽量减少页面 ...

  6. psql的jsonb操作--存储对象/对象数组

    1. 建表 create table demo( id serial NOT NULL PRIMARY KEY, name ), info JSONB ); 2.存储对象操作 2.1添加 insert ...

  7. 趣谈编程史第3期-大器晚成的新晋流量Python发展史

    写在前面 这篇博文主要介绍javaScript的发展史,根据作者在B站发布的同名视频的文案整理修改而成,对视频感兴趣的博友可访问https://www.bilibili.com/video/av860 ...

  8. Python入门的三大问题和三大谎言

    Python广告,铺天盖地,小白们雾里看花,Python无限美好.作为会20几种语言(BASIC Foxbase/pro VB VC C C++ c# js typescript HTML Ardui ...

  9. 02 HDFS 分布式环境实战

    HDFS的主要设计理念 1.存储超大文件 这里的“超大文件”是指几百MB.GB甚至TB级别的文件. 2.最高效的访问模式是 一次写入.多次读取(流式数据访问)3.运行在普通廉价的服务器上 HDFS设计 ...

  10. 什么是data:image/png;base64,?一道关于Data URI Scheme的入门级CTF_Web题

    一道关于Data URI Scheme的入门级CTF_Web题 0x00 题目描述 这是偶尔遇到的某网安交流群的入群题,题目没有任何的提示,直接给了一个txt文件. 0x01 解题过程 通过给的这个文 ...