POJ 1523 SPF 割点与桥的推断算法-Tarjan
题目链接:
题意:
问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分
题解:
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的更多相关文章
- POJ 1523 SPF (割点,连通分量)
题意:给出一个网络(不一定连通),求所有的割点,以及割点可以切分出多少个连通分量. 思路:很多种情况. (1)如果给的图已经不是连通图,直接“ No SPF nodes”. (2)求所有割点应该不难 ...
- POJ 1523 SPF 割点 Tarjan
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9317 Accepted: 4218 Description C ...
- Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题
Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...
- POJ 1523 SPF (去掉割点能形成联通块的个数)
思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...
- poj 1523 SPF(双连通分量割点模板)
题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...
- zoj 1119 / poj 1523 SPF (典型例题 求割点 Tarjan 算法)
poj : http://poj.org/problem?id=1523 如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, ...
- poj 1523 SPF 求割点以及删除该割点后联通块的数量
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7136 Accepted: 3255 Description C ...
- POJ 1523 SPF tarjan求割点
SPF Time Limit: 1000MS Memory Limit ...
- POJ 1523 SPF(求割点)
题目链接 题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量. 思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边. //poj1523 #includ ...
随机推荐
- Hibernate 、 Axis2发布
1. you just compile your web-service into aar file (not include bean files), copy the aar into axis2 ...
- SQLite简单介绍
一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1)归档:NSCodeing.NSKeyed ...
- 保存已登录plsql developer的用户名和密码
1.保存用户名 tools -> Preferences -> User Interface - Options 勾选 Autosave username . 保存 2.保存密码 tool ...
- 解释-DNS,A记录,CNAME记录,域名转向,SRV记录,TTL值,泛域名与泛解析,域名绑定
http://www.lihongye.net/post/dns.html DNS DNS,Domain Name System或者Domain Name Service(域名系统或者域名服务).域名 ...
- AOE网与关键路径简介
前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程, ...
- 关于JavaScript中name的意义冲突
在昨天的<Javascript权威指南>学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源码贴在以下: <script typ ...
- 本地服务器能ping通,但是ssh及各种端口都访问不到---待整理
情况描述: 情况一:后来发现,开机需要很长一段时间之后才能正常的访问那台机器 原因:系统启动时加载的程序多,所以开机需要很长的时间,关掉不用的就可以了 情况二:服务器位于局域网内,有的时候可以访问到, ...
- [转] 禁止ultraedit自动检查更新的方法
菜单栏: 高级->配置->应用程序布局->其他 取消勾选“自动检查更新” (原文地址:http://blog.csdn.net/redeyerabbit/article/deta ...
- 统计学习方法:支撑向量机(SVM)
作者:桂. 时间:2017-05-13 21:52:14 链接:http://www.cnblogs.com/xingshansi/p/6850684.html 前言 主要记录SVM的相关知识,参考 ...
- uva 10537 Toll! Revisited(优先队列优化dijstra及变形)
Toll! Revisited 大致题意:有两种节点,一种是大写字母,一种是小写字母. 首先输入m条边.当经过小写字母时须要付一单位的过路费.当经过大写字母时,要付当前財务的1/20做过路费. 问在起 ...