#define N 500005 #define M 4000005 int n,m; int frm[N],to[M],nxt[M],_=1; int dfn[N],low[N],dfncnt; int bridge[M],c[N],dcccnt; vector<int>e[N]; void addedge(int u,int v){ to[++_]=v; nxt[_]=frm[u]; frm[u]=_; } void tarjan(int u,int in_edge){ dfn[u]=low[u]=++dfncnt; for(int i=frm[u];i;i=nxt[i]){ int v=to[i]; if(!dfn[v]){ tarjan(v,i); low[u]=min(low[u],low[v]); if(low[v]>dfn[u]) bridge[i]=bridge[i^1]=1; } else if(i!=(in_edge^1)) low[u]=min(low[u],dfn[v]); } }
void dfs(int u){ c[u]=dcccnt; e[dcccnt].push_back(u); for(int i=frm[u];i;i=nxt[i]){ int v=to[i]; if(c[v]||bridge[i])continue; dfs(v); } }
int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); if(u==v)continue; addedge(u,v); addedge(v,u); } for(int i=1;i<=n;i++) if(!dfn[i])tarjan(i,0); for(int i=1;i<=n;i++) if(!c[i]){ dcccnt++; dfs(i); } printf("%d\n",dcccnt); for(int i=1;i<=dcccnt;i++){ printf("%d ",e[i].size()); for(int j=0;j<e[i].size();j++) printf("%d ",e[i][j]); printf("\n"); } return 0; }
|