苣蒻挂在第53点上,码风还行,求求各位大佬帮忙!!!
查看原帖
苣蒻挂在第53点上,码风还行,求求各位大佬帮忙!!!
648772
Liyuqiao11楼主2023/8/24 12:02
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
int m,fa[N],vis[N],d[N],bzz[N],ans[N],ans_2[N],c,q,bz,bz_2;
vector<pair<int,int> > G[N];
stack<int> s;
map<int,int> mp;
int find(int x){
    if(fa[x]==x) return x;
    else return fa[x]=find(fa[x]);
}
void merge(int x,int y){
    int fx=find(x),fy=find(y);
    if(fx!=fy){
        fa[fx]=fy;
    }
}
void dfs(int x){
    for(int i=0;i<G[x].size();i++){
        if(!bzz[G[x][i].second]){
            bzz[G[x][i].second]=1;
            dfs(G[x][i].first);
            s.push(G[x][i].second);
        }
    }
}
int main(){
    freopen("input.txt","r",stdin); 
    freopen("output.txt","w",stdout); 
    cin>>m;
    for(int i=1;i<=N-10;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        G[x].push_back(make_pair(y,i));
        G[y].push_back(make_pair(x,i));
        vis[x]=1;
        vis[y]=1;
        d[x]++;
        d[y]++;
        merge(x,y);
    }
    if(m==1){
        cout<<-1<<endl;
        exit(0);
    }
    int cnt=0;
    for(int i=1;i<=N-10;i++){
        if(!vis[i]) continue;
        if(fa[i]==i){
            cnt++;
            if(cnt==1) bz=i;
            else bz_2=i;
        }
    }
    if(cnt==1){
        int tot=0,bz_3=1;
        for(int i=1;i<=N-10;i++){
            if(!vis[i]) continue;
            if(d[i]%2==1&&tot==0){
                tot++;
                bz=i;
            }
            else if(d[i]%2==1&&tot==1){
                tot++;
                bz_2=i;
            }
            else if(d[i]%2==1&&tot==2){
                tot++;
                bz_3=i;
            }
            else if(d[i]%2==1){ 
                tot++;
            }
        }
        if(tot==0||tot==2){
            dfs(bz);
            int dc=0;
            while(!s.empty()){
                int x=s.top();
                s.pop();
                if(dc==0) ans[1]=x;
                else ans_2[dc]=x;
                dc++;
            }
            cout<<1<<endl;
            cout<<ans[1]<<endl;
            cout<<dc-1<<endl;
            for(int i=1;i<dc;i++){
                cout<<ans_2[i]<<endl;
            }
        }
        else if(tot==4){
            G[bz].push_back(make_pair(bz_2,m+1));
            dfs(bz_3);
            bool flag=true;
            while(!s.empty()){
                int x=s.top();
                s.pop();
                if(x!=m+1&&flag){
                    ans[++c]=x;
                }
                if(x==m+1||!flag){
                    flag=false;
                    if(x!=m+1) ans_2[++q]=x;
                }
            }
            cout<<c<<endl;
            for(int i=1;i<=c;i++){
                cout<<ans[i]<<endl;
            }
            cout<<q<<endl;
            for(int i=1;i<=q;i++){
                cout<<ans_2[i]<<endl;
            }
        }
        else{
            cout<<-1<<endl;
        }
    }
    else if(cnt==2){
        int tot=0,tot_2=0;
        for(int i=1;i<=N-10;i++){
            if(!vis[i]) continue;
            else if(d[i]%2==1&&fa[find(i)]==fa[find(bz)]){
                tot++;
            }
            else if(d[i]%2==1&&fa[find(i)]!=fa[find(bz)]){
                bz_2=i;
                tot_2++;
            }
        }
        if(tot==0||tot==2){
            if(tot_2==0||tot_2==2){
                dfs(bz);
                while(!s.empty()){
                    int x=s.top();
                    s.pop();
                    ans[++c]=x;
                }
                dfs(bz_2);
                while(!s.empty()){
                    int x=s.top();
                    s.pop();
                    ans_2[++q]=x;
                }
                cout<<c<<endl;
                for(int i=1;i<=c;i++){
                    cout<<ans[i]<<endl;
                }
                cout<<q<<endl;
                for(int i=1;i<=q;i++){
                    cout<<ans_2[i]<<endl;
                }
            }
            else{
                cout<<-1<<endl;
            }
        }
        else{
            cout<<-1<<endl;
        }
    }
    else{
        cout<<-1<<endl;
    }
    return 0;
}
2023/8/24 12:02
加载中...