85分求救

P8436 【模板】边双连通分量

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;
} 

|