嘟嘟嘟
dfs後,如果 low[v] >= dfn[u],則 u 就是割點。
不過如果 u 是搜尋樹的根節點的話,還要判斷他至少有兩個出邊,而且這個判斷必須加在v沒有被走到的前提下。這樣就表示有一些點只能通過根節點走到,那麼如果這種點多於1個的話,根節點就是割點了。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11view codeusing
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 }
模板 割點(割頂)
給出乙個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的上面,就是沒有返祖...