Cod sursa(job #2629609)

Utilizator bem.andreiIceman bem.andrei Data 21 iunie 2020 19:20:52
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("ciclueuler.in");
ofstream w("ciclueuler.out");
int n, m;
class str{
    public:
    int n1, n2;
};
str p[500002];
vector<int>g[100002], f;
bool viz[100002];
void dfs(int a){
    viz[a]=1;
    for(auto it:g[a]){
        if(viz[p[it].n1+p[it].n2-a]==0){
            dfs(p[it].n1+p[it].n2-a);
        }
    }
}
bool ver(){
    dfs(1);
    for(int i=1;i<=n;i++){
        if(viz[i]==0 || g[i].size()%2==1){
            return 0;
        }
    }
    return 1;
}
int edg(int a){
    while(g[a].size()!=0 && viz[g[a].back()]==1){
        g[a].pop_back();
    }
    if(g[a].size()!=0){
        int b=g[a].back();
        g[a].pop_back();
        viz[b]=1;
        return p[b].n1+p[b].n2-a;
    }
    return 0;
}
void euler(int a){
    while(int b=edg(a)){
        euler(b);
    }
    f.push_back(a);
}
int main()
{
    r>>n>>m;
    for(int i=0;i<m;i++){
        int x, y;
        r>>x>>y;
        g[x].push_back(i);
        g[y].push_back(i);
        p[i].n1=x;
        p[i].n2=y;
    }
    if(ver()==0){
        w<<"-1\n";
        return 0;
    }
    memset(viz, 0, sizeof(viz));
    euler(1);
    f.pop_back();
    for(auto it:f){
        w<<it<<" ";
    }
    return 0;
}