题目链接: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求割点以及删除割点之后强连通分量的数量的更多相关文章

  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. PHP 全局使用 Laravel 辅助函数 dd

    dump() 方法 全局 composer.json 12345 "require": { "squizlabs/php_codesniffer": " ...

  2. Python的Flask框架开发RESTful API

    web框架选择 Django,流行但是笨重,还麻烦,人生苦短,肯定不选 web.py,轻量,但据说作者仙逝无人维护,好吧,先pass tornado,据说倡导自己造轮子,虽然是facebook开源的吧 ...

  3. Java8-19-lambda 重构代码

    通过本书的前七章,我们了解了Lambda和Stream API的强大威力. 你可能主要在新项目的代码中使用这些特性.如果你创建的是全新的Java项目,这是极好的时机,你可以轻装上阵,迅速地将新特性应用 ...

  4. JAVA如何判断两个字符串是否相等

    ==比较引用,equals 比较值 1.java中字符串的比较:== 我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题 example1: String a=&qu ...

  5. TCP与三次握手

    TCP是在不可靠的网络层上提供可靠的传输服务.如何理解?假设你拥有一个快递公司,但是快递小哥不是很靠谱, 送货偶尔会出问题,所以你经常收到投诉电话,处理一些复杂的问题.比如有些快递压舱了,有些丢失了, ...

  6. AndroidStudio自动导入包

    IntelliJ IDEA可以自动优化导入包,但是有多个同名的类位于不同的包时,需要自己手动使用Alt + Enter进行导入. Settings→Editor→General→Auto Import ...

  7. PyGame学习笔记之壹

    新建窗口 代码 '''PyGame学习笔记之壹''' import pygame # 引入 PyGame 库 pygame.init() # PyGame 库初始化 screen = pygame.d ...

  8. Android入门(创建、编译、运行、打包、安装)

    一.创建Android项目 1.选择Emtpy Activity=>Next 2.配置项目 输入Name(名称) Package.name(包名) Save location(保存位置) Lan ...

  9. HTML笔记03------cookie

    新浪布局 初始布局代码: div.header+(div.container>(div.left+div.right))+div.footer ---------- .header{height ...

  10. Java入门教程十三(多线程)

    线程的概念 单纯种以一个任务完成以后再进行下一个任务的模式进行,这样下一个任务的开始必须等待前一个任务的结束,只有一个任务完成后才能进行下一个任务.Java 语言提供了并发机制,允许开发人员在程序中执 ...