Cod sursa(job #2988087)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 3 martie 2023 16:07:25
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
using namespace std;

ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");

const int MAX = 1e5 + 1;

struct muchie{

    int y , i;

};

vector <muchie> g[MAX];

int n , x , y , m , last[MAX] , sizes[MAX];

bitset<MAX> marcat;
bitset<MAX*5> b;

vector <int> ans;

void read(){

    cin >> n >> m;

    while(m){

        cin >> x >> y;

        g[x].push_back({y,m});
        g[y].push_back({x,m});

        sizes[x]++;
        sizes[y]++;

        m--;
    }
}

void dfs( int x ){

    marcat[x] = 1;

    for(auto it : g[x]){

        if(!marcat[it.y]) dfs(it.y);
    }
}

int check(){

    int to_be_remembered;

    for(int i = 1 ; i <= n ; i++){

        if(sizes[i]){

            dfs(i);

            break;
        }
    }

    for(int i = 1 ; i <= n ; i++){

        int x = sizes[i];

        if(x%2){

            cout << -1;

            exit(0);
        }

        if(!x) continue;

        if(!marcat[i]){

            cout << -1;

            exit(0);
        }

        to_be_remembered = i;
    }

    return to_be_remembered;
}

void euler( int x ){

    for(int i = last[x] ; i < sizes[x] ; i++){

        muchie it = g[x][i];

        last[x]++;

        if(!b[it.i]){

            b[it.i] = 1;

            euler(it.y);
        }
    }

    ans.push_back(x);
}

void afis(){

    ans.pop_back();

    for(auto it : ans){

        cout << it << ' ';
    }

}

int main()
{

    read();

    int x = check();

    euler(x);
    afis();

    return 0;
}