题目链接:

POJ1523

题意:

问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分

题解:

Tarjan 算法模板题

顺序遍历整个图,能够得到一棵生成树:

树边:可理解为在DFS过程中訪问未訪问节点时所经过的边。也称为父子边



回边:可理解为在DFS过程中遇到已訪问节点时所经过的边。也称为返祖边、后向边



对根节点u,若其有两棵或两棵以上的子树。则该根结点u为割点。



对非叶子节点u(非根节点)。若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。

// 当(u,v)为树边且low[v]>dfn[u]时,表示v节点仅仅能通过该边(u,v)与u连通,那么(u,v)即为割边。

用一个数组保存每一个节点的子树个数就可以

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 1050
using namespace std;
int dfn[maxn],low[maxn]; //dfs序 和子树连接的最小节点
int vis[maxn];
vector<int>edge[maxn];
int child[maxn];
int num,son;
void init()
{
memset(vis,0,sizeof(vis));
memset(child,0,sizeof(child));
vis[1]=1;
num=0;
son=0;
}
void Tarjan(int u)
{
dfn[u]=low[u]=++num;
vis[u]=1;
for(int i=0; i<edge[u].size(); i++)
{
int v=edge[u][i];
if(!vis[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<=low[v]) //得到子树
{
if(u!=1)
child[u]++;
else
son++;
}
}
else low[u]=min(low[u],dfn[v]);
}
}
int main()
{
// freopen("in.txt","r",stdin);
int a,b;
int Case=1;
while(1)
{
while(scanf("%d",&a)&&a)
{ scanf("%d",&b);
edge[a].push_back(b);
edge[b].push_back(a);
}
init(); Tarjan(1);
// for(int i=1;i<=5;i++)
// cout<<dfn[i]<<" "<<low[i]<<endl;
if(Case>1)
cout<<endl;
printf("Network #%d\n",Case++);
int flag=1;
child[1]=son-1;
for(int i=1; i<=1000; i++)
if(child[i]>0)
{
flag=0;
printf(" SPF node %d leaves %d subnets\n",i,child[i]+1);
}
if(flag)
cout<<" No SPF nodes"<<endl; for(int i=1; i<=1000; i++)
edge[i].clear();
scanf("%d",&a);
if(a==0)
break;
scanf("%d",&b);
edge[a].push_back(b);
edge[b].push_back(a);
}
return 0;
}

POJ 1523 SPF 割点与桥的推断算法-Tarjan的更多相关文章

  1. POJ 1523 SPF (割点,连通分量)

    题意:给出一个网络(不一定连通),求所有的割点,以及割点可以切分出多少个连通分量. 思路:很多种情况. (1)如果给的图已经不是连通图,直接“  No SPF nodes”. (2)求所有割点应该不难 ...

  2. POJ 1523 SPF 割点 Tarjan

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9317   Accepted: 4218 Description C ...

  3. Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题

    Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...

  4. POJ 1523 SPF (去掉割点能形成联通块的个数)

    思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...

  5. poj 1523 SPF(双连通分量割点模板)

    题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...

  6. zoj 1119 / poj 1523 SPF (典型例题 求割点 Tarjan 算法)

    poj : http://poj.org/problem?id=1523 如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, ...

  7. poj 1523 SPF 求割点以及删除该割点后联通块的数量

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7136   Accepted: 3255 Description C ...

  8. POJ 1523 SPF tarjan求割点

                                                                   SPF Time Limit: 1000MS   Memory Limit ...

  9. POJ 1523 SPF(求割点)

    题目链接 题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量. 思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边. //poj1523 #includ ...

随机推荐

  1. 配置Eclipse 3.3 + tomcat 6.0 + lomboz 3.3进行Web开发

    http://www.cnblogs.com/xtsong/articles/1203155.html我以前编程用的都是Eclipse 3.2,这次跑到www.eclipse.org上去溜达了一番,发 ...

  2. 用一个URL加一个JAVA壳做成一个安卓应用

    若想获得更新版本欢迎加入我们的 “本地应用开发webapp"群,一起协力开发一处编写处处运行的“本地应用”.我们将一直开源,将智慧共享,只有这样我们才能一起将应用体验做好! 特点: 1.程序 ...

  3. 关于android闹钟,设置定时提醒的一点心得

    首先在设置提醒之前你需要一个入口,比如说onclick事件中,在此不做赘述. android中使用闹钟进行提醒其实非常简单,你只需要告知系统你想在什么时候被提醒,然后需要一个闹钟的广播接收器,当到你设 ...

  4. Linux命令-进程查看命令:ps

    查看进行 ps aux

  5. Python学习笔记011——内置函数eval()

    1 描述 eval()  函数用来执行一个字符串表达式,并返回表达式的值 2 语法 原文 eval(expression[, globals=None[, locals=None]]) express ...

  6. oc Delegate

    把内部的状态通知给外界,我们可以制定一个变量,然后这个变量从外界来指定,之后我们可以通过变量去通知给外界有什么发生了. 按照上文讲的到新建一个protocol,名字为IPeople #import & ...

  7. Error_GL_KeyflexfieldDefinitionFactory.getStructureNumber无法找到应用产品

    2014-07-12 BaoXinjian

  8. epoll 系列函数简介、与select、poll 的区别

    一.epoll 系列函数简介 #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags) ...

  9. OJ刷题---罗马数字转十进制

    题目要求: 输入代码: #include<iostream> using namespace std; int main() { int i,j,n,k; int num[7]= {1, ...

  10. python 中 with 用法

    前言 with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源, 比如文件使用后自动关闭/线程中锁的自动获取和释放等. 问题引出 如下代码: fil ...