码迷,mamicode.com
首页 > 其他好文 > 详细

[模板]割点(割顶)

时间:2018-02-18 10:28:02      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:scanf   ring   tarjan   include   割点   void   http   ide   ++i   

https://www.luogu.org/problemnew/show/P3388
技术分享图片
 1 // luogu-judger-enable-o2
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cmath>
 7 #include <set>
 8 using namespace std;
 9 struct Edge{int v, next;}G[200010];
10 set<int>s;
11 int head[100010], tot, dfn[100010], low[100010], n, m;
12 bool cut[100010];int idx;
13 inline void add(int u, int v){
14     G[++tot].v=v;G[tot].next=head[u];head[u]=tot;
15     G[++tot].v=u;G[tot].next=head[v];head[v]=tot;
16 }
17 inline void tarjan(int u, int fa){
18     dfn[u] = low[u] = ++idx;
19     int child = 0;
20     for(int i=head[u];i;i=G[i].next){
21         int v = G[i].v;
22         if (!dfn[v]){
23             child++;
24             tarjan(v, u);
25             low[u] = min(low[u], low[v]);
26             if (u != fa && low[v] >= dfn[u]) s.insert(u);
27             if (fa == u && child == 2) s.insert(u);
28         }
29         else if (v != fa) low[u] = min(low[u], dfn[v]);
30     }
31 }
32 
33 int main(void){
34     scanf("%d%d", &n, &m);
35     while(m--){
36         int u, v; scanf("%d%d", &u, &v);add(u, v);
37     }
38     for(int i = 1; i <= n; ++i) if (!dfn[i]) tarjan(i, i);
39     printf("%d\n", s.size());
40     for(set<int>::iterator it = s.begin();it!=s.end(); ++it){
41         printf("%d ", *it);
42     }
43     return 0;
44 }
View Code

 

[模板]割点(割顶)

标签:scanf   ring   tarjan   include   割点   void   http   ide   ++i   

原文地址:https://www.cnblogs.com/Ycrpro/p/8452485.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!