%
定義某個點為割點,當且僅當刪除這個點後原圖的連通分量個數增加。給定一張有 n
nn 個點圖,求其割點數量,輸出這些點的編號。
定義:pre(u
)\text(u)
pre(u)
表示第一次訪問到點u的時刻。
low (u
)\text(u)
low(u)
表示點 u
uu 及其後代在不經過 u
uu 點和樹邊的情況下所能到達的最早的祖先的 pre
\text
pre 值。
那麼點 u
uu 是割點當且僅當 u
uu 存在乙個子節點 v
vv,滿足 low(v
)⩾
pre(u)
\text(v)\geqslant\text(u)
low(v)
⩾pre(u
)。其中 pre
\text
pre 和 low
\text
low 可以遞迴時求出。注意根節點只有乙個孩子時,根節點不為割點。
**如下:
// luogu-judger-enable-o2
#include
using
namespace std;
#define maxn 20010
#define maxm 100010
int n,m;
struct edgeedges[maxm<<1]
;int head[maxn]
,len;
void
ins(
int u,
int v)
; head[u]
=len;
}int pre[maxn]
,cuts[maxn]
,cnt;
intdfs
(int u,
int fa=-1
)else
if(pre[v]
&&v!=fa)
lowu=
min(lowu,pre[v]);
}if(fa==-1
&&ch_cnt==
1) cuts[u]=0
;return
/*low[u]=*/lowu;
}int
main()
for(
int i=
1;i<=n;i++)if
(pre[i]==0
)dfs
(i);
int counts=0;
for(
int i=
1;i<=n;i++
) counts+
=cuts[i]
;printf
("%d\n"
,counts)
;for
(int i=
1;i<=n;i++)if
(cuts[i]
)printf
("%d "
,i);
return0;
}
P3388 模板 割點(割頂)
割點 題目描述 給出乙個n個點,m條邊的無向圖,求圖的割點。輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入樣例 1 複製6 7 1 21 3 1 42 5 3 54 5 5 6輸出樣例 1 複製...
P3388 模板 割點(割頂)
割點 給出乙個n個點,m條邊的無向圖,求圖的割點。輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入樣例 1 6 7 1 21 3 1 42 5 3 54 5 5 6 輸出樣例 1 1 5 n,m均...
P3388 模板 割點(割頂)
n 給定一張無向圖g g g,求圖的割點 s ol utio nsolution soluti on判斷條件 非搜尋樹起點x xx,任意乙個子節點y yy,滿足dfn x l ow y dfn x low y dfn x l ow y 搜尋樹起點rtrt rt,至少兩個子節點y yy,滿足dfn x...