概念

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求割点桥相关推荐

  1. tarjan求割点和桥(割边)

    tarjan求割点和桥 参考博客:tarjan求割点和桥(割边) 例题:割点 代码(重要的地方在代码中都有注释): #include<bits/stdc++.h> #define ll l ...

  2. tarjan求割点和桥(割边)模板

    tanjan算法相关概念 为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边.两条边互为反向边. 从图中一点作为起点,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树, ...

  3. 图论 —— 图的连通性 —— Tarjan 求割点与桥

    [概念] 1.割点 1)割点:删除某点后,整个图变为不连通的两个部分的点 2)割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 3)点连通度:最小割点集合点数 如上 ...

  4. poj1144 - tarjan求割点

    何为割点?也就是题目中的关键点.在一个无向图中,去掉一个点,这个无向图会变成多个子图,那么这个点就叫做割点 同理,割边也是如此,如果去掉一条边,能让无向图变成多个子图,那么这条边叫做割边,所谓的桥. ...

  5. [UVA315]Network(tarjan, 求割点)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. UVA - 315 Network(tarjan求割点)

    题目链接:点击查看 题目大意:给出一个由n台电脑互相连接而成的网络系统,其中有一些电脑如果一旦损坏,则会造成整个网络出现缺口,导致某些地方无法互相连通,我们称这种电脑为关键点,题目需要求出有多少个关键 ...

  7. 【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)

    题干: Consider the two networks shown below. Assuming that data moves around these networks only betwe ...

  8. POJ_2117 Elcctricity (tarjan 求割点)

    题意:求一个图中删掉一个结点所得到的连通块数量最大. 思路:设一个结点u,如果u是根结点(图可能是不连通的,所以可能有多个根结点)则删掉u所增加的连通块数为 SUM(u的子结点) - 1: 如果u是非 ...

  9. 【Gym - 101986F】Pizza Delivery(Dijkstra最短路,建图方式,反向建图,Tarjan求桥,图论模板)

    题干: 题目大意: 一个有向图,编号1~n的n个点,m条边,规定1为起点,2为终点,问对于每一条边,反转它的方向,最短路会不会发生改变,如果变短了,输出HAPPY,变长了或者到达不了了输出SAD,不变 ...

最新文章

  1. 3.相应重定向与请求转发的比较
  2. Oracle中的备份和恢复之前必须知道的
  3. 【杂谈】有三AI知识星球最近都GAN了哪些内容?
  4. mybatis 模糊查询
  5. micropython stm32f103_MicroPython技术及应用定义
  6. 开发里程碑计划_项目里程碑你真的会用了吗?(干货)
  7. python从url获取pdf文件并保存在本地
  8. 如何开启MySQL的慢查询日志
  9. iOS工程开发笔记二
  10. 小甲鱼python课后习题【1,2,3,4,5】
  11. 博弈论分析题_“博弈论”习题和参考答案与解析
  12. VB/VBA的浮点数结构
  13. 【统计学知识案例实践】—数据分析实战案例
  14. Android shape半圆,1/4圆
  15. PM应具备的规划技巧-顾客价值管理
  16. Python3修改电脑mac地址
  17. project 2016 显示、取消任务序号
  18. 华为v5服务器raid设置系统,华为服务器2288hv5raid阵列卡制作
  19. Github 怎么用?(一)
  20. gzip压缩文件损坏的修复方法

热门文章

  1. 2022-2028年中国场景金融行业深度调研及投资前景预测报告
  2. etcd 笔记(07)— 键值对读写操作过程
  3. 2022-2028年中国pu管行业市场深度分析及市场规模预测报告
  4. Jeff Dean回顾谷歌2021
  5. AIFramework基本概念整理
  6. GPU上的基本线性代数
  7. Yolov4性能分析(下)
  8. AlexeyAB DarkNet YOLOv3框架解析与应用实践(五)
  9. Android中Service生命周期、启动、绑定、混合使用
  10. Docker核心技术之仓库