割點 洛谷P3388

2022-05-19 02:09:13 字數 1174 閱讀 9882

割點

給出乙個n個點,m條邊的無向圖,求圖的割點。

輸入格式:

第一行輸入n,m

下面m行每行輸入x,y表示x到y有一條邊

輸出格式:

第一行輸出割點個數

第二行按照節點編號從小到大輸出節點,用空格隔開

輸入樣例#1:

671

2131

4253

5455

6

輸出樣例#1:

1

5

對於全部資料,20000n≤20000,100000m≤100000

點的編號均大於0小於等於n。

tarjan圖不一定聯通。

tarjan!tarjan!tarjan!重要的事情說三遍!

割點是跟著縮點一起學的qaq

縮點在這裡

割點板子:

#include#include

#include

using

namespace

std;

const

int maxn=100010

;bool

vis[maxn];

int n,m,ans=0,cnt=0,num=0

;int

dfn[maxn],low[maxn],head[maxn];

struct

edgecute[maxn

<<1

]; void build(int x,int

y)void tarjan(int x,int

fa) low[x]=min(dfn[y],low[x]);

}if(x==fa&&child>=2) vis[x]=true;}

intmain()

for(int i=1;i<=n;i++)

if(!dfn[i]) tarjan(i,i);

for(int i=1;i<=n;i++)

if(vis[i]) ans++;

printf(

"%d\n

",ans);

for(int i=1;i<=n;i++)

if(vis[i]) printf("

%d "

,i);

return0;

}

洛谷P3388 模板 割點

給出乙個n個點,m條邊的無向圖,求圖的割點。u是cut vertex的兩個條件 1.存在v使v及其所有後代沒有反向邊連回u的祖先 2.u是根且有兩個以上子節點 dfs一遍 low u 是u及其後代所能連回的最早祖先 沒有dfn v 就dfs v 然後用low v 更新low u v是u的後代 否則v...

洛谷P3388 模板 割點

都快忘了割點怎麼搞了 對所有點分兩類 1.根節點 2.非根節點 顯然根節點是很好做的 只需要數一下有沒有兩個子樹以上 對於非根節點 利用tarjan演算法 回憶到dfn的定義 時間戳,即在dfs中第幾個被訪問到 low 經過最多一條後向邊 棧中橫叉邊能到達的最小的節點時間戳 對於當前節點now來說,...

洛谷P3388 模板 割點

模板 割點 割點集合 乙個頂點集合v,刪除該集合的所有定點以及與這些頂點相連的邊後,原圖不連通,就稱集合v為割點集合 點連通度 最小割點集合中的頂點數 邊連通度 最小割邊集合中的邊數 割點 割點集合中唯一的乙個元素 tarjan求縮點 乙個點為縮點的條件 1.該點為根,搜尋樹中有大於1個子樹 2.該...