POJ1144 tarjan+网络中割点与割边的数量
题目链接:http://poj.org/problem?id=1144
割点与割边的数量我们可以通过tarjan的思想从一个点开始对其余点进行访问。访问的顺序构成一棵dfs树,其中根节点到任何一个结点都只有唯一的一条路径。算法基于以下两个定理:
定理一:
dfs树的根结点T是割点当且仅当他有两个或者更多的子节点。因为dfs树上任何点的子树都是不连通的,否则就会构成环,与dfs树的定义矛盾。故定理得证。
定理二 :
dfs树上的非根结点是割点当且仅当u至少存在一个子节点v,v的所有后代都没有回退边连回u的祖先,也就是从v出发能够访问到的最浅的结点比u的深度大。因为此时把u割去之后一定会使得v为根的分支被割离。
根据以上定理,我们只要记录dfs的顺序,每个点的开始访问的最浅dfs深度并进行比较,即low[v]>=low[u]就可以得到割点的数量。对于割边,我们只要u的子结点v有low[v]>num[u]就说明(u,v)是割边。
代码如下:
#include<cstdio>
#include<vector>
#include<string.h>
using namespace std;
const int maxn=;
int low[maxn],num[maxn];//分别保存dfs树上结点能到达的最浅深度和dfs的访问顺序
bool iscut[maxn];//记录是否是割点
vector<int>G[maxn];//存边
int dfn;//记录递归的顺序,用于给num赋值
int ans=;//ans记录割点的数量
int n;
void tarjan(int u,int fa)//参数分别是当前搜索的结点以及其父结点
{
low[u]=num[u]=++dfn;//设置dfs的访问顺序,u是dfs访问的第一个点
int child=;//u的子树的数量
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(!num[v])//v点没有进入过dfs树,也就是没有访问过
{
child++;
tarjan(v,u);
low[u]=min(low[u],low[v]);//low[i]的意义是点i所能到的dfs深度最浅的值,father结点由child结点来更新
if(low[v]>=num[u]&&u!=)//注意要判断u不是根节点,因为定理中是分为非根节点以及根节点进行讨论的,根节点根节点最后讨论
{
iscut[u]=;
}
}
// else low[u]=min(low[u],num[v]);
else if(num[v]<num[u]&&v!=fa)// fa也是u的邻居,在之前已经访问过;
//处理回退边 ,u的子节点可以不通过u访问u以上的结点
{
low[u]=min(low[u],num[v]);
}
}
if(u==&&child>=)
{
iscut[u]=;//根结点有两个或以上的独立子树
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
int t,k;
for(int i=;i<=n;i++)G[i].clear();
memset(iscut,,sizeof(iscut));
memset(low,,sizeof(low));
memset(num,,sizeof(num));
ans=;
dfn=;
while(scanf("%d",&t)==&&t)
{
while(getchar()!='\n')
{
scanf("%d",&k);
G[t].push_back(k);
G[k].push_back(t);
}
}
tarjan(,-);
for(int i=;i<=n;i++)ans+=iscut[i];//扫描割点的数量 printf("%d\n",ans);
}
}
POJ1144 tarjan+网络中割点与割边的数量的更多相关文章
- Tarjan在图论中的应用(二)——用Tarjan来求割点与割边
前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...
- Tarjan 算法求割点、 割边、 强联通分量
Tarjan算法是一个基于dfs的搜索算法, 可以在O(N+M)的复杂度内求出图的割点.割边和强联通分量等信息. https://www.cnblogs.com/shadowland/p/587225 ...
- Tarjan的学习笔记 求割边求割点
博主图论比较弱,搜了模版也不会用... 所以决心学习下tarjan算法. 割点和割边的概念不在赘述,tarjan能在线性时间复杂度内求出割边. 重要的概念:时间戟,就是一个全局变量clock记录访问结 ...
- hihoCoder 1183 连通性一·割边与割点(Tarjan求割点与割边)
#1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢 ...
- 『Tarjan算法 无向图的割点与割边』
无向图的割点与割边 定义:给定无相连通图\(G=(V,E)\) 若对于\(x \in V\),从图中删去节点\(x\)以及所有与\(x\)关联的边后,\(G\)分裂为两个或以上不连通的子图,则称\(x ...
- Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
历时好几天,终于完工了! 支持无向图四种功能:1.割点的求解 2.割边的求解 3.点双连通分量的求解 4.边双连通分量的求解 全部支持重边!!!!全部支持重边!!!!全部支持重边!!!! 测试数据: ...
- 图论分支-Tarjan初步-割点和割边
所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- Tarjan无向图的割点和桥(割边)全网详解&算法笔记&通俗易懂
更好的阅读体验&惊喜&原文链接 感谢@yxc的腿部挂件 大佬,指出本文不够严谨的地方,万分感谢! Tarjan无向图的割点和桥(割边) 导言 在掌握这个算法前,咱们有几个先决条件. [ ...
随机推荐
- 成为数据专家,你只差一个Quick Insights的距离
身处如今的大数据时代,你真的知道如何处理数据和分析数据吗?或许那些被你忽视的数据背后就暗藏着重要的商业灵感.并非人人都是数据专家,有时候你需要一些专业的软件来帮你处理数据.那么如何能快速.准确地从数据 ...
- C2C的道德边界:沦为从假运单到假病条的供假渠道
你可能刚开始学会不去看网购平台上商品回评中的虚假好评,却又要开始应对同事在朋友圈等平台买来的虚开病假条带来的困扰.最近各大媒体包括党报热传的网购病假条事件,再度将人们的目光集中在这个C2C模式之上.从 ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
- Python 将两个绝对路径拼接
import os def two_abs_join(abs1, abs2): """ 将 绝对路径将两个绝对路径拼接, 就是将第二个的开路径(windows 的 C, ...
- 得亏了它,我才把潜藏那么深的Bug挖出来
2020年写了很多事故解决的文章,并不是我绞尽脑汁想出来的,而是真的遇到了这些问题.通过文章的方式记录下来,分享出去,才有意义. 事故背景 首先看下面的图吧,这是我从cat上截的图. 可以看到是一个R ...
- Pycharm+PyQt5开发环境配置
一.安装Python开发环境 python官网下载地址:https://www.python.org/downloads/ 注:千万不要使用最新测试版,很有可能第三方库不支持 笔者目前使用的版本是3. ...
- react-native 使用leanclound消息推送
iOS消息推送的基本流程 1.注册:为应用程序申请消息推送服务.此时你的设备会向APNs服务器发送注册请求.2. APNs服务器接受请求,并将deviceToken返给你设备上的应用程序 3.客户端应 ...
- 提高开发效率之VS Code基础配置篇
背景 之前一直是只用WebStorm作为IDE来编写代码,但是由于: 手中的这台Mac接了两个显示器以后,使用WebStorm会有卡顿. WebStorm需要付费(虽然可以通过某方法和谐). 所以需要 ...
- 前端javascript知识(二)
documen.write和 innerHTML的区别 document.write只能重绘整个页面 innerHTML可以重绘页面的一部分 浏览器检测通过什么? (1) navigator.user ...
- 总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)
概述 调试asp.net core程序时,在输出窗口中,在输出来源选择“调试”或“xxx-ASP.NET Core Web服务器”时,可以看到类似“info:Microsoft.AspNetCore. ...