rmzls @ 2022-08-19 22:35:48
求救。。 1 3 12wa了 好像说是有重边但是加了判断还wa 求大佬帮忙看看
#include<bits/stdc++.h>
using namespace std;
bool dfv[500005];
int dfn[500005],low[500005];
vector<vector<int> > g;
vector<vector<int> > ans;
vector<vector<int> > isb;
int num=0,am=0,n,m;
void taj(int x,int a){
//cout<<2<<' ';
num++;
low[x]=dfn[x]=num;
for(int i=0;i<g[x].size();i++){
int y=g[x][i];
if(dfn[y]==0){
taj(y,x);
low[x]=min(low[x],low[y]);
if(low[y]>dfn[x]){
isb[x].push_back(y);
isb[y].push_back(x);
}
}
else if(g[x][i]!=a){
low[x]=min(low[x],dfn[y]);
}
}
}
void dfs(int x){
dfv[x]=true;
//cout<<1<<' ';
if(x!=0){
ans[am].push_back(x);
}
for(int i=0;i<g[x].size();i++){
int y=g[x][i];
if(!dfv[y]){
bool flag=true;
for(int k=0;k<isb[x].size();k++){
if(isb[x][k]==y){
flag=false;
break;
}
}
for(int k=0;k<isb[y].size();k++){
if(isb[y][k]==x){
flag=false;
break;
}
}
if(flag){
dfs(y);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
g.resize(n+3);
ans.resize(n+3);
isb.resize(n+3);
for(int i=1;i<=m;i++){
int sdo,fi;
bool flag=false;
scanf("%d%d",&sdo,&fi);
for(int k=0;k<g[sdo].size();k++){
if(g[sdo][k]==fi){
flag=true;
break;
}
}
for(int k=0;k<g[fi].size();k++){
if(g[fi][k]==sdo){
flag=true;
break;
}
}
if(flag){
continue;
}
else{
g[sdo].push_back(fi);
g[fi].push_back(sdo);
}
}
for(int i=1;i<=n;i++){
if(dfn[i]==0){
taj(i,0);
}
}
cout<<endl;
for(int i=1;i<=n;i++){
if(!dfv[i]){
am++;
dfs(i);
}
}
printf("%d\n",am);
for(int i=1;i<=am;i++){
printf("%d ",ans[i].size());
for(int j=0;j<ans[i].size();j++){
printf("%d ",ans[i][j]);
}
printf("\n");
}
return 0;
}