图的割点
时间:2019-10-20
本文章向大家介绍图的割点,主要包括图的割点使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
传送门:https://www.luogu.org/problem/P3388
还有两点要注意的
1.割点可能有很多个
2.无向图和有向图都有割点
然后我们来看一看如何实现割点
方案一:枚举去掉每个点的情况,DFS判断时间复杂度O(n^2)
方案二:Tarjan实现
同样是用dfn表示搜索次序,但是low表示可以最早回溯到的祖先的dfn值
之后就和tarjan没有太多不同了
#include<bits/stdc++.h> using namespace std; int n,m; struct edge{ int next,to; }e[200009];int tot; int first[100009]; int dfn[100009]; int low[100009]; int js; int ans; bool book[100009]; inline void add_edge(int a,int b) { e[++tot].to=b; e[tot].next=first[a]; first[a]=tot; } inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } void tarjan(int now,int fa)//now是我在那里,fa是我的爸爸是谁 { js++; dfn[now]=js,low[now]=js; int child=0;//记录有几个子树 for(int i=first[now];i;i=e[i].next) { if(dfn[e[i].to]==0) { tarjan(e[i].to,now); if(low[now]>low[e[i].to])low[now]=low[e[i].to]; if(now==fa)child++;//如果是根结点就+1 if(now!=fa&&low[e[i].to]>=dfn[now])book[now]=true;//如果不是根结点并且它的子节点不通过它就无法回到之前的节点,那么说明它就是割点 } else if(e[i].to!=fa&&dfn[e[i].to]<=low[now]) { low[now]=dfn[e[i].to]; } } if(now==fa&&child>=2)book[now]=true;//如果是根结点,并且儿子数量有两个以上那么明显就是割点 return; } int main() { n=read(),m=read(); for(register int i=1;i<=m;i++) { int a=read(),b=read(); add_edge(a,b); add_edge(b,a); } for(int i=1;i<=n;i++) { if(dfn[i]==0) { tarjan(i,i);//因为割点有多个,并且图可能本身不连通,所以多次枚举 } } for(int i=1;i<=n;i++) { if(book[i]==true)ans++; } cout<<ans<<endl; for(int i=1;i<=n;i++) { if(book[i]==true) { cout<<i<<" "; } } return 0; }
原文地址:https://www.cnblogs.com/1129-tangqiyuan/p/11707801.html
- HDU 1019 Least Common Multiple【gcd+lcm+水+多个数的lcm】
- HDU 1017 A Mathematical Curiosity【水,坑】
- 比特币项目
- HDU 1014 Uniform Generator【GCD,水】
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战05】SARSA(λ)算法实现
- 区块链应用场景:物联网和物流供应链
- HDU 1012 u Calculate e【暴力打表,水】
- Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】
- HDU 1013 Digital Roots【字符串,水】
- Gym 100952I&&2015 HIAST Collegiate Programming Contest I. Mancala【模拟】
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
- Gym 100952E&&2015 HIAST Collegiate Programming Contest E. Arrange Teams【DFS+剪枝】
- Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
- Gym 100952G&&2015 HIAST Collegiate Programming Contest G. The jar of divisors【简单博弈】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 还在手动部署SpringBoot应用?试试这个自动化插件!
- Julia简易教程——3_复数和分数
- 怎么理解int main(int argc, const char *argv[])
- Julia简易教程——2_julia数学运算及其基本功能
- Elasticsearch: 运用 Field collapsing 来减少基于单个字段的搜索结果
- Julia简易教程——1_julia中的整数和浮点数
- Linux 工作常用命令笔记(持续更新)
- Vim实用技巧——Vim分屏技巧总结
- Activity onStop,onDestroy延迟10s执行
- 内存优化实战
- Nali:一个离线查询 IP 地理信息和 CDN 提供商的终端利器
- MySQL8.0的几个新特性
- read_only和super_read_only参数的区别
- AWS 命名提示需要指定 region
- AWS CodeArtifact 如何设置用户的 TOKEN