博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3388 【模板】割点
阅读量:5119 次
发布时间:2019-06-13

本文共 1170 字,大约阅读时间需要 3 分钟。

 

题目背景

割点

题目描述

给出一个n个点,m条边的无向图,求图的割点。

输入输出格式

输入格式:

 

第一行输入n,m

下面m行每行输入x,y表示x到y有一条边

 

输出格式:

 

第一行输出割点个数

第二行按照节点编号从小到大输出节点,用空格隔开

 

输入输出样例

输入样例#1: 
6 71 21 31 42 53 54 55 6
输出样例#1: 
1 5

说明

n,m均为100000

tarjan图不一定联通!!!

点的编号均大于0小于等于n

 

#include 
using namespace std;using ll=long long;const int MAXN=1e5+10;struct node{ int v; int Next;}edge[MAXN<<1 ];int head[MAXN], cnt,low[MAXN],dfn[MAXN],Time;bool vis[MAXN];void add(int u,int v){ edge[++cnt].v=v; edge[cnt].Next=head[u]; head[u]=cnt;}void tarjan(int u,int fa){ dfn[u]=low[u]=++Time; int child=0; for (int i = head[u]; i !=-1 ; i=edge[i].Next) { int v=edge[i].v; if(!dfn[v]) { //没有被访问过。 tarjan(v,fa); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]&&u!=fa)//一个点能连接到最远的祖先节点仍大于或者等于他的父亲节点,那么他的父亲节点一定是割点 vis[u]=1; if(u==fa) child++; } low[u]=min(low[u],dfn[v]);//求割点时只能是dfn[v],强连通分量可以是dfn[v]||low[v] } if(child>=2&&u==fa) vis[u]=1;}int main(){ int n,m; scanf("%d%d",&n,&m); memset(head,-1, sizeof(head)); int u,v; for (int i = 0; i

  

转载于:https://www.cnblogs.com/-xiangyang/p/9511256.html

你可能感兴趣的文章
CGRect知多少
查看>>
Android 开发环境安装配置手册
查看>>
Qt工程文件说明
查看>>
[SQL Server 系] T-SQL数据库的创建与修改
查看>>
WIN7下搭建CORDOVA环境
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
300 多个免费网站和应用资源
查看>>
Oracle数据库备份还原工具之Expdp/IMPdp
查看>>
【来龙去脉系列】什么是区块链?
查看>>
Wpf 之Canvas介绍
查看>>
Java工程师学习指南 入门篇
查看>>
linux history
查看>>
rpm软件包类型
查看>>
除去内容中的空格与换行
查看>>
jQuery on(),live(),trigger()
查看>>
卡尔曼滤波的原理说明
查看>>
对Kalman(卡尔曼)滤波器的理解@@zz
查看>>
局部敏感哈希(Locality-Sensitive Hashing, LSH)
查看>>
Python2.7 urlparse
查看>>