Tarjan求割点桥
概念
1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。
2.割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点。
割点特点:1)当前节点为树根的时候,条件是“要有多余一棵子树”(如果这有一颗子树,去掉这个点也没有影响,如果有两颗子树,去掉这点,两颗子树就不连通了。)
2)当前节点U不是树根的时候,条件是“low[v]>=dfn[u]”,也就是在u之后遍历的点,能够向上翻,最多到u,(如果能翻到u的上方,那就有环了,去掉u之后,图仍然连通。)
桥的特点:若是一条无向边(u,v)是桥,
1)当且仅当无向边(u,v)是树枝边的时候,需要满足dfn(u)<low(v),也就是v向上翻不到u及其以上的点,那么u--v之间一定能够有1条或者多条边不能删去,因为他们之间有一部分无环,是桥。( 如果v能上翻到u那么u--v就是一个环,删除其中一条路径后,能然是连通的)
注意点:
1)求桥的时候:因为边是无方向的,所以父亲孩子节点的关系需要自己规定一下,
在tarjan的过程中if(v不是u的父节点) low[u]=min(low[u],dfn[v]);
因为如果v是u的父亲,那么这条无向边就被误认为是环了。
2)找桥的时候:注意看看有没有重边,有重边的边一定不是桥,也要避免误判。
也可以先进行tarjan(),求出每一个点的dfn和low,并记录dfs过程中的每个点的父节点,遍历所有点的low,dfn来寻找桥和割点
(dfn[u]表示u点第一次访问到的时间戳,low[u],表示以及u的子孙所能到达的最小时间戳)
#include<iostream> using namespace std; #include<cstdio> #include<cstring> #include<vector> #define N 201 vector<int>G[N]; int n,m,low[N],dfn[N]; bool is_cut[N]; int father[N]; int tim=0; void Tarjan(int i,int Father) {father[i]=Father;/*记录每一个点的父亲*/dfn[i]=low[i]=tim++;for(int j=0;j<G[i].size();++j){int k=G[i][j];if(dfn[k]==-1){Tarjan(k,i);low[i]=min(low[i],low[k]);}else if(Father!=k)/*假如k是i的父亲的话,那么这就是无向边中的重边,有重边那么一定不是桥*/low[i]=min(low[i],dfn[k]);//dfn[k]可能!=low[k],所以不能用low[k]代替dfn[k],否则会上翻过头了。 } } int main() {scanf("%d%d",&n,&m);int a,b;for(int i=1;i<=m;++i){scanf("%d%d",&a,&b);G[a].push_back(b);/*邻接表储存无向边*/G[b].push_back(a);}memset(dfn,-1,sizeof(dfn));memset(father,0,sizeof(father));memset(low,-1,sizeof(low));memset(is_cut,false,sizeof(is_cut));int rootson=0;Tarjan(1,0);for(int i=2;i<=n;++i){int v=father[i];if(v==1)rootson++;/*统计根节点子树的个数,根节点的子树个数>=2,就是割点*/else{if(low[i]>=dfn[v])/*割点的条件*/is_cut[v]=true;}return 0; }
转载于:https://www.cnblogs.com/zzrblogs/p/10401102.html
Tarjan求割点桥相关推荐
- tarjan求割点和桥(割边)
tarjan求割点和桥 参考博客:tarjan求割点和桥(割边) 例题:割点 代码(重要的地方在代码中都有注释): #include<bits/stdc++.h> #define ll l ...
- tarjan求割点和桥(割边)模板
tanjan算法相关概念 为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边.两条边互为反向边. 从图中一点作为起点,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树, ...
- 图论 —— 图的连通性 —— Tarjan 求割点与桥
[概念] 1.割点 1)割点:删除某点后,整个图变为不连通的两个部分的点 2)割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 3)点连通度:最小割点集合点数 如上 ...
- poj1144 - tarjan求割点
何为割点?也就是题目中的关键点.在一个无向图中,去掉一个点,这个无向图会变成多个子图,那么这个点就叫做割点 同理,割边也是如此,如果去掉一条边,能让无向图变成多个子图,那么这条边叫做割边,所谓的桥. ...
- [UVA315]Network(tarjan, 求割点)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA - 315 Network(tarjan求割点)
题目链接:点击查看 题目大意:给出一个由n台电脑互相连接而成的网络系统,其中有一些电脑如果一旦损坏,则会造成整个网络出现缺口,导致某些地方无法互相连通,我们称这种电脑为关键点,题目需要求出有多少个关键 ...
- 【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)
题干: Consider the two networks shown below. Assuming that data moves around these networks only betwe ...
- POJ_2117 Elcctricity (tarjan 求割点)
题意:求一个图中删掉一个结点所得到的连通块数量最大. 思路:设一个结点u,如果u是根结点(图可能是不连通的,所以可能有多个根结点)则删掉u所增加的连通块数为 SUM(u的子结点) - 1: 如果u是非 ...
- 【Gym - 101986F】Pizza Delivery(Dijkstra最短路,建图方式,反向建图,Tarjan求桥,图论模板)
题干: 题目大意: 一个有向图,编号1~n的n个点,m条边,规定1为起点,2为终点,问对于每一条边,反转它的方向,最短路会不会发生改变,如果变短了,输出HAPPY,变长了或者到达不了了输出SAD,不变 ...
最新文章
- 3.相应重定向与请求转发的比较
- Oracle中的备份和恢复之前必须知道的
- 【杂谈】有三AI知识星球最近都GAN了哪些内容?
- mybatis 模糊查询
- micropython stm32f103_MicroPython技术及应用定义
- 开发里程碑计划_项目里程碑你真的会用了吗?(干货)
- python从url获取pdf文件并保存在本地
- 如何开启MySQL的慢查询日志
- iOS工程开发笔记二
- 小甲鱼python课后习题【1,2,3,4,5】
- 博弈论分析题_“博弈论”习题和参考答案与解析
- VB/VBA的浮点数结构
- 【统计学知识案例实践】—数据分析实战案例
- Android shape半圆,1/4圆
- PM应具备的规划技巧-顾客价值管理
- Python3修改电脑mac地址
- project 2016 显示、取消任务序号
- 华为v5服务器raid设置系统,华为服务器2288hv5raid阵列卡制作
- Github 怎么用?(一)
- gzip压缩文件损坏的修复方法