【模板】割点(割顶)

题面

割点模板

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N (1000000+10)
 4 using namespace std;
 5 int a[N],nxt[N],head[N],dfn[N],low[N],cnt,k;
 6 bool cut[N],bst[N];
 7 void add(int x,int y){
 8     a[++k]=y; nxt[k]=head[x]; head[x]=k;
 9 }
10 void tarjan(int u,int mr){
11     int rc=0;
12     dfn[u]=low[u]=++cnt;
13     for (int p=head[u];p;p=nxt[p]){
14         int v=a[p];
15         if (!dfn[v]){
16             tarjan(v,mr);
17             low[u]=min(low[u],low[v]);
18             if (low[v]>=dfn[u]&&u!=mr) cut[u]=true;
19             if (u==mr) rc++;
20         }
21         low[u]=min(low[u],dfn[v]);
22     }    
23     if (u==mr&&rc>=2) cut[mr]=true;
24 }
25 int main(){
26     int n,m,ans=0;
27     scanf("%d%d",&n,&m);
28     for (int i=1;i<=m;i++){
29         int x,y;
30         scanf("%d%d",&x,&y);
31         add(x,y);
32         add(y,x);
33     }
34     for (int i=1;i<=n;i++){
35         if (!dfn[i]) tarjan(i,i);
36     }
37     //for (int i=1;i<=n;i++) printf("%d %d %d\n",i,dfn[i],low[i]);
38     for (int i=1;i<=n;i++) if (cut[i]) ans++;
39     printf("%d\n",ans);
40     for (int i=1;i<=n;i++) if (cut[i]) printf("%d ",i);
41 }

 

posted @ 2019-07-09 13:35  [jackeylove]  阅读(113)  评论(0编辑  收藏  举报