模板 割點(割頂)

2022-05-09 14:34:32 字數 1399 閱讀 5507

嘟嘟嘟

dfs後,如果 low[v] >= dfn[u],則 u 就是割點。

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

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a) memset(a, 0, sizeof(a))

15 typedef long

long

ll;16 typedef double

db;17

const

int inf = 0x3f3f3f3f;18

const db eps = 1e-8;19

const

int maxn = 1e5 + 5;20

inline ll read()

2125

while(isdigit(ch))

26if(last == '

-') ans = -ans;

27return

ans;28}

29 inline void

write(ll x)

3035

36int

n, m;

37 vectorv[maxn];

3839

int dfn[maxn], low[maxn], cnt = 0;40

bool

cut[maxn];

41int root, ccnt = 0;42

void tarjan(int

now)

43

60} 61}

62else low[now] =min(low[now], dfn[v[now][i]]);63}

6465}66

67int

main()

6876

for(int i = 1; i <= n; ++i) if(!dfn[i]) root =i, tarjan(i);

77write(ccnt); enter;

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

(cut[i]) write(i), space; enter;

79return0;

80 }

view code

模板 割點(割頂)

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

模板 割點(割頂)

題目背景 割點題目描述 給出乙個n個點,m條邊的無向圖,求圖的割點。輸入輸出格式 輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入輸出樣例 輸入樣例 1 6 7 1 2 1 3 1 4 2 5 3...

割點割頂tarjan

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