模板 割點(割頂)

2021-08-20 09:05:15 字數 1205 閱讀 5791

題目背景

割點題目描述

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

輸入輸出格式

輸入格式:

第一行輸入n,m

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

輸出格式:

第一行輸出割點個數

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

輸入輸出樣例

輸入樣例#1:

6 7

1 2

1 3

1 4

2 5

3 5

4 5

5 6

輸出樣例#1:

1 5

說明 n,m均為100000

tarjan 圖不一定聯通!!!

. .

. .

.程式:

#include 

#include

#include

using

namespace

std;

int n,m;

int head[100005],bel[100005],dfn[200005],low[200005];

intstack[100005],to[200005],nex[200005],fa[200005],tot;

int cnt=1;

bool cut[200005];

void add(int x,int y)

void tarjan(int p)

low[p]=min(low[p],dfn[v]);

}if (p==fa[p]&&rd>=2) cut[fa[p]]=true;

}int main()

memset(dfn,0,sizeof(dfn));

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

fa[i]=i;

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

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

int ans=0;

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

if (cut[i]) ans++;

printf("%d\n",ans);

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

if (cut[i]) printf("%d ",i);

return

0;}

模板 割點(割頂)

給出乙個n個點,m條邊的無向圖,求圖的割點。輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 n,m均為100000 tarjan 圖不一定聯通!求割點。這可以用到之前學的tarjan。對於一棵生成樹,...

模板 割點(割頂)

嘟嘟嘟 dfs後,如果 low v dfn u 則 u 就是割點。不過如果 u 是搜尋樹的根節點的話,還要判斷他至少有兩個出邊,而且這個判斷必須加在v沒有被走到的前提下。這樣就表示有一些點只能通過根節點走到,那麼如果這種點多於1個的話,根節點就是割點了。1 include2 include3 inc...

割點割頂tarjan

原題 首先tarjan求割點的重點就是dfn和low陣列的理解。dfn i 就是時間戳,即在什麼時刻搜尋到了點i,low i 則是i點能回溯到的dfn最小的祖先,搜尋的時候判斷一下當對於點x存在兒子節點y,使得dfn x low y 則x一定是割點。因為只要x的子節點不能回溯到x的上面,就是沒有返祖...