P3388 模板 割點(割頂)(水)

2021-09-25 18:38:56 字數 1567 閱讀 5497

%

定義某個點為割點,當且僅當刪除這個點後原圖的連通分量個數增加。給定一張有 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...