tarjan-无向图(求割点)
一、基本概念
1、割点:无向连通图中,如果删除某点后,图变成不连通,则称改点为割点。
2、桥:无向连通图中,如果去掉某条边后,整张无向图会分成两部分(即整张图不连通),这样的一条边成为桥。
3、点双连通分量:无割点的极大连通子图
任意两点间都有⾄至少两条不不经过相同边的路径
4、边双连通分量:无割边的极大连通子图
任意两点间都有⾄至少两条(除起点和终点外)不不经过相同点的路径
二、tarjan求割点
1)当前节点为树根时,成为割点的条件是“要有多于一个子树”(如果只有一棵子树,去掉这个点也没有影响,如果有两颗子树,去掉这个点,两颗子树就不连通了)
2)当前节点不是树根的时候,条件是“low [ v ] >= dfn [ u ] ”,也就是在u之后遍历的点,能够向上翻,最多到u。(如果能翻到u的上方,那就有环了,去掉u之后,图仍然连通。)所以,保证v向上翻最多到u才可以
#include<cstdio>
#include<algorithm>
using namespace std; inline int read()
{
int sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
} const int maxn = ,maxm = ;
int n,m,tot;
int dfn[maxn],low[maxn],tim;
int cnt,head[maxn];
struct edge
{
int nxt,to;
}e[maxm * ];
bool mrk[maxn]; void add(int x,int y)
{
e[++cnt].nxt = head[x];
e[cnt].to = y;
head[x] = cnt;
} void tarjan(int u,int fa)
{
dfn[u] = low[u] = ++tim;
int child = ;
for(int i = head[u];i;i = e[i].nxt)
{
int v = e[i].to;
if(!dfn[v])
{
tarjan(v,fa);
low[u] = min(low[u],low[v]);
if(low[v] >= dfn[u] && u != fa)
mrk[u] = true;
if(u == fa)
child++;
}
low[u] = min(low[u],dfn[v]);
}
if(child >= && u == fa)
mrk[u] = true;
} int main()
{
n = read(),m = read();
for(int i = ;i <= m;i++)
{
int x = read(),y = read();
add(x,y);
add(y,x);
}
for(int i = ;i <= n;i++)
if(!dfn[i])
tarjan(i,i);
for(int i = ;i <= n;i++)
if(mrk[i])
tot++;
printf("%d\n",tot);
for(int i = ;i <= n;i++)
if(mrk[i])
printf("%d ",i);
return ;
}
tarjan-无向图(求割点)的更多相关文章
- uva 315 Network(无向图求割点)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Tarjan算法求割点
(声明:以下图片来源于网络) Tarjan算法求出割点个数 首先来了解什么是连通图 在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- UVA 315 Network (模板题)(无向图求割点)
<题目链接> 题目大意: 给出一个无向图,求出其中的割点数量. 解题分析: 无向图求割点模板题. 一个顶点u是割点,当且仅当满足 (1) u为树根,且u有多于一个子树. (2) u不为树根 ...
- Tarjan无向图的割点和桥(割边)全网详解&算法笔记&通俗易懂
更好的阅读体验&惊喜&原文链接 感谢@yxc的腿部挂件 大佬,指出本文不够严谨的地方,万分感谢! Tarjan无向图的割点和桥(割边) 导言 在掌握这个算法前,咱们有几个先决条件. [ ...
- Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】
一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...
- (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- 无向图求割点 UVA 315 Network
输入数据处理正确其余的就是套强联通的模板了 #include <iostream> #include <cstdlib> #include <cstdio> #in ...
- tarjan算法求割点cojs 8
tarjan求割点:cojs 8. 备用交换机 ★★ 输入文件:gd.in 输出文件:gd.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] n个城市之间有通讯网 ...
- (连通图 模板题 无向图求割点)Network --UVA--315(POJ--1144)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- Java生鲜电商平台-生鲜电商订单结算系统的深入解析与反思总结
Java生鲜电商平台-生鲜电商订单结算系统的深入解析与反思总结 说明:最近疫情影响,生鲜电商这个行业被彻底的激活了,全中国人民都知道用小程序或者APP可以进行买菜了,但是可惜的是,我的生鲜电商在去年经 ...
- win10中批量新建文件夹
1.新建一个bat文件,如[批量新建.bat].或者新建txt文件,输入完内容后重命名为bat文件 2.建议用notepad软件打开文件,首先确定编码格式为ANSI编码 (否则最后出现的效果是乱码,不 ...
- [P3806] 【模板】点分治 - 点分治
辣鸡蒟蒻怎么今天才来敲这个模板题 好像还敲了很久的样子 (大雾) #include <bits/stdc++.h> using namespace std; #define int lon ...
- ORA-00928: missing SELECT keyword
问题描述 ORA-00928: missing SELECT keyword 问题原因 未写表名
- C#源码转PlantUml
1.下载编译开源工程PlantUmlClassDiagramGenerator 2.使用PlantUmlClassDiagramGenerator生成PlantUml文件 3.配置Vscode的Pla ...
- 大数据-es(elasticsearch)
elasticsearch elasticsearch是lucene作为核心的实时分布式检索,底层使用倒排索引实现. 倒排索引原理 索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不 ...
- bootstrap联动校验(转载)
接触bootstrapvalidator时间不久,最近需要多个字段共同验证,网上查了一下未找到,查阅api文档,发现确实可以实现. 先看dom <div class="form-gro ...
- 小匠第一周期打卡笔记-Task01
一.线性回归 知识点记录 线性回归输出是一个连续值,因此适用于回归问题.如预测房屋价格.气温.销售额等连续值的问题.是单层神经网络. 线性判别模型 判别模型 性质:建模预测变量和观测变量之间的关系,亦 ...
- 美多商城后台MIS系统部署之Nginx配置
先进入Nginx的配置文件中,进行配置. Nginx配置文件夹的区别: cd /etc/nginx/conf.d/ 创建.conf后缀的文件 /etc/nginx/sites-enabled 创 ...
- QT+VS后中文字符乱码问题
在VS中写QT项目会出现中文乱码现象,尤其是控件的中文乱码以及qDebug()时候中文乱码通用的解决办法: 在头文件(.h)前面加上如下代码: #ifdef WIN32 #pragma executi ...