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

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

Definition&Solution

  在一个无向联通图中,如果删除一个点,该图变得不连通,那么该点称作该图的割点。注意,割点可能不止一个。

  对于无向不连通图,一个点是割点当且仅当它是它所在的联通分量的割点。

  特别的,如果一个连通分量只包含一个点X,那么点X为一个割点。

  对于一个图,求他的割点,只需要对每个连通分量进行dfs,在dfs树上,一个非根节点是割点当且仅当他的子树的反向边全部指向他的子树。如果使用low[i]来代表点i所能连接的最小dfs序的点,dfn代表该点的dfs序,一个非根节点i是割点当且仅当对于所有的to=edge[j].to,满足low[to]>=dfn[i]。在dfs过程中,易于顺手求出dfs序和low值。

  对于一个根节点,根节点是割点当且仅当它有两个及以上子树。

Example

Description

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

Input

第一行输入n,m

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

Output

第一行输出割点个数

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

Sample Input

6 71 21 31 42 53 54 55 6

Sample Output

1 5

Solution

板子题。

Code

#include
#define maxn 100010#define maxm 200010inline void qr(int &x) { char ch=getchar(),lst=NULL; while(ch>'9'||ch<'0') lst=ch,ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); if(lst=='-') x=-x;}template
inline T mmax(const T &a,const T &b) {
if(a>b) return a;return b;}template
inline T mmin(const T &a,const T &b) {
if(a
inline T mabs(const T &a) {
if(a>=0) return a;return -a;}template
inline void spaw(T &a,T &b) {T temp=a;a=b;b=temp;}int n,m,a,b;int ans[maxn],cnt;bool is_cut[maxn];struct Edge { int to,nxt;};Edge edge[maxm];int hd[maxn],ecnt;inline void cont(int from,int to) { edge[++ecnt].to=to; edge[ecnt].nxt=hd[from]; hd[from]=ecnt;}int dfn[maxn],low[maxn],vistime;void tarjan(int,int);int main() { qr(n);qr(m); while(m--) { a=b=0;qr(a);qr(b); cont(a,b); cont(b,a); } for(int i=1;i<=n;++i) { if(!dfn[i]) tarjan(i,i); if(is_cut[i]) ans[++cnt]=i; } printf("%d\n",cnt); for(int i=1;i<=cnt;++i) printf("%d ",ans[i]);}void tarjan(const int u,const int rt) { int v,cld=0; dfn[u]=low[u]=++vistime; for(int i=hd[u];i;i=edge[i].nxt) { v=edge[i].to; if(!dfn[v]) { tarjan(v,rt); low[u]=mmin(low[u],low[v]); if(u==rt) ++cld; else if(low[v]>=dfn[u]) is_cut[u]=true; } low[u]=mmin(low[u],dfn[v]); } if((rt==u)&&(cld>1)) is_cut[u]=true;}

Summary

tarjan算法有很多,不要混淆(tarjan爷牛逼

区分代码中v和u,否则会死。

区分代码中dfn和low。否则会死

转载于:https://www.cnblogs.com/yifusuyi/p/9389977.html

你可能感兴趣的文章
Knockout.Js官网学习(enable绑定、disable绑定)
查看>>
hive基本操作与应用
查看>>
excel快捷键设置
查看>>
poj3692
查看>>
python之信号量【Semaphore】
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
#HTTP协议学习# (二)基本认证
查看>>
Android开发之线性布局详解(布局权重)
查看>>
WCF
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>
Android实例-录音与回放(播放MP3)(XE8+小米2)
查看>>
CSS——(2)与标准流盒模型
查看>>
MYSQL 基本SQL语句
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>