POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量
题目链接:http://poj.org/problem?id=1523
SPF:A Single Point of Failure也就是割点(一个点导致网络之间的不连通),由于给出的图是无向图,所以只要连通就一定强连通。要求连通分支的数量就是要求请联通分支的数量,我们可想到tarjan求强连通的步骤,只要一群结点的low值相同他们就是属于同一个SCC(Strongly Connected Component),所以我们只要对于每一个割点,记录一下这个点所到的其他结点的不相同的low值的数量,就是这个点能够将网络分成的连通分支的数量。因为在dfs树上,如果一个根结点是割点的话,对于他的每一个子节点,我们进行一次深搜(没访问过的),并且标记访问,表上记号,等到所有的子结点全部搜完就记号的数量就是强连通分量的个数。
代码如下:
- #include<cstdio>
- #include<string.h>
- #include<set>
- #include<iostream>
- using namespace std;
- const int maxn =1e3+;
- int head[maxn],nxt[maxn],iscut[maxn],dfn[maxn],low[maxn];
- bool vis[maxn];
- struct node{
- int u,v;
- }p[maxn];
- int e;
- int n,cnt;
- void addedge(int u,int v)
- {
- p[e].u=u;
- p[e].v=v;
- nxt[e]=head[u];
- head[u]=e++;
- }
- void tarjan(int u,int fa)
- {
- dfn[u]=low[u]=++cnt;//dfn为dfs时间戳,low为回退边指向的最小祖先
- int child=;
- for(int i=head[u];~i;i=nxt[i])
- {
- int v=p[i].v;
- if(!dfn[v])
- {
- tarjan(v,u);
- low[u]=min(low[u],low[v]);
- child++;
- if(u!=&&low[v]>=dfn[u])iscut[u]=;
- }
- else if(dfn[v]<dfn[u]&&v!=fa)//回退边
- {
- low[u]=min(low[u],dfn[v]);
- }
- }
- if(u==&&child>=)iscut[]=;
- }
- int main()
- {
- int x,y;
- int step=;
- while(scanf("%d",&x)&&x)
- {
- scanf("%d",&y);
- n=;
- memset(head,-,sizeof(head));
- memset(nxt,-,sizeof(nxt));
- memset(dfn,,sizeof(dfn));
- memset(low,,sizeof(low));
- memset(iscut,,sizeof(iscut));
- memset(vis,,sizeof(vis));
- cnt=;
- e=;
- n=max(max(x,y),n);
- addedge(x,y);addedge(y,x);
- while(scanf("%d",&x)&&x)
- {
- scanf("%d",&y);
- n=max(max(x,y),n);
- addedge(x,y);addedge(y,x);
- }
- tarjan(,-);//从结点一开始建立dfs树
- set<int> s;
- bool flag=false;
- printf("Network #%d\n",++step);
- for(int i=;i<=n;i++)
- {
- s.clear();
- if(iscut[i])//对于每一个割点查找连通分量的数量
- {
- flag=true;
- for(int j=head[i];~j;j=nxt[j])
- {
- s.insert(low[p[j].v]);//搜索不同的low值数量
- }
- }
- if(s.size())
- printf(" SPF node %d leaves %d subnets\n",i,s.size());
- }
- if(!flag)printf(" No SPF nodes\n");
- printf("\n");
- }
- }
POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量的更多相关文章
- HDU5739-Fantasia(tarjan求割点)
题意:给一个无向图n个点1~n,m条边,sigma(i*zi)%(1e9+7).zi是这个图删掉i点之后的价值.一个图的价值是所有连通子图的价值之和,连通图的价值是每个点的乘积. 题解:讲道理这题不算 ...
- BZOJ 2730 矿场搭建 Tarjan求割点
思路: Tarjan求出来点双&割点 判一判就行了 //By SiriusRen #include <stack> #include <cstdio> #include ...
- tarjan算法-解决有向图中求强连通分量的利器
小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...
- Tarjan算法初探 (1):Tarjan如何求有向图的强连通分量
在此大概讲一下初学Tarjan算法的领悟( QwQ) Tarjan算法 是图论的非常经典的算法 可以用来寻找有向图中的强连通分量 与此同时也可以通过寻找图中的强连通分量来进行缩点 首先给出强连通分量的 ...
- [学习笔记] Tarjan算法求强连通分量
今天,我们要探讨的就是--Tarjan算法. Tarjan算法的主要作用便是求一张无向图中的强连通分量,并且用它缩点,把原本一个杂乱无章的有向图转化为一张DAG(有向无环图),以便解决之后的问题. 首 ...
- POJ2186 Popular Cows 强连通分量tarjan
做这题主要是为了学习一下tarjan的强连通分量,因为包括桥,双连通分量,强连通分量很多的求法其实都可以源于tarjan的这种方法,通过一个low,pre数组求出来. 题意:给你许多的A->B ...
- 算法模板——Tarjan强连通分量
功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有 ...
- tarjan算法强连通分量的正确性解释+错误更新方法的解释!!!+hdu1269
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 以下内容为原创,转载请声明. 强连通分量SCC(Strongly Connected Compo ...
- 强连通分量的Tarjan算法
资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tar ...
随机推荐
- windows 下 基于express搭建 https协议的网站
参考 https://blog.csdn.net/xingyanchao/article/details/79362443 问题在于生成SSL证书的时候Windows环境下会报错 解决方案 参考 ht ...
- SpringMVC之添加照片并修改照片名字
@RequestMapping(value="/addIdcardsSubmit",method={RequestMethod.POST,RequestMethod.GET}) p ...
- 参考C# 使用 System.Web.Script.Serialization 解析 JSON
参考C# 使用 System.Web.Script.Serialization 解析 JSON 使用json需要引用到System.Web.Script.Serialization.习惯在解决方案右键 ...
- 字符串匹配算法 之BF、KMP
示例: 1. 已知字符串str1="acabaabaabcacaabc",求str2="abaabcac"是否在字符串str1中? 2. DNA病毒检测.已知患 ...
- Angular 1 深度解析:脏数据检查与 angular 性能优化
TL;DR 脏检查是一种模型到视图的数据映射机制,由 $apply 或 $digest 触发. 脏检查的范围是整个页面,不受区域或组件划分影响 使用尽量简单的绑定表达式提升脏检查执行速度 尽量减少页面 ...
- psql的jsonb操作--存储对象/对象数组
1. 建表 create table demo( id serial NOT NULL PRIMARY KEY, name ), info JSONB ); 2.存储对象操作 2.1添加 insert ...
- 趣谈编程史第3期-大器晚成的新晋流量Python发展史
写在前面 这篇博文主要介绍javaScript的发展史,根据作者在B站发布的同名视频的文案整理修改而成,对视频感兴趣的博友可访问https://www.bilibili.com/video/av860 ...
- Python入门的三大问题和三大谎言
Python广告,铺天盖地,小白们雾里看花,Python无限美好.作为会20几种语言(BASIC Foxbase/pro VB VC C C++ c# js typescript HTML Ardui ...
- 02 HDFS 分布式环境实战
HDFS的主要设计理念 1.存储超大文件 这里的“超大文件”是指几百MB.GB甚至TB级别的文件. 2.最高效的访问模式是 一次写入.多次读取(流式数据访问)3.运行在普通廉价的服务器上 HDFS设计 ...
- 什么是data:image/png;base64,?一道关于Data URI Scheme的入门级CTF_Web题
一道关于Data URI Scheme的入门级CTF_Web题 0x00 题目描述 这是偶尔遇到的某网安交流群的入群题,题目没有任何的提示,直接给了一个txt文件. 0x01 解题过程 通过给的这个文 ...