【模板】 割點(割頂)
阿新 • • 發佈:2018-10-31
神馬網站的連結都可以啊~~~~
模板題,無程式說明
Code:
#include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<=k;i++) using namespace std; template<typename T> void read(T &num){ char c=getchar();num=0;T f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();} num*=f; } template<typename T> void qwq(T x){ if(x>9)qwq(x/10); putchar(x%10+'0'); } template<typename T> void write(T x){ if(x<0){x=-x;putchar('-');} qwq(x); } int ans[20010]; struct wzy{ int nxt,vertice; }edge[200010]; int head[20010];int len=0; inline void add_edge(int x,int y){ edge[++len].nxt=head[x];edge[len].vertice=y;head[x]=len; return; } int low[20010];int dfn[20010];bool iscut[20010];int siz=0; inline void tarjan(int son,int father){ low[son]=dfn[son]=++siz; int coun=0; for(register int i=head[son];i;i=edge[i].nxt){ int nop=edge[i].vertice; if(!dfn[nop]){ tarjan(nop,father); low[son]=min(low[son],low[nop]); iscut[son]|=(low[nop]>=dfn[son]&&son!=father); coun+=(son==father); } low[son]=min(low[son],dfn[nop]); } iscut[son]|=(son==father&&coun>=2); return; } int main(){ int n,m;read(n);read(m); rep(i,1,m){ int x,y;read(x);read(y); add_edge(x,y);add_edge(y,x); } rep(i,1,n){ if(!dfn[i])tarjan(i,i); } int ans_len=0; rep(i,1,n){ if(iscut[i])ans[++ans_len]=i; } write(ans_len);putchar('\n'); rep(i,1,ans_len){write(ans[i]);putchar((i==ans_len)?'\n':' ');} return 0; }