Cod sursa(job #2141813)

Utilizator remus88Neatu Remus Mihai remus88 Data 24 februarie 2018 16:26:13
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <bitset>
#include <vector>
#define Nmax 100008
#define Nmax2 500000

using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

typedef pair <int,int> edge;

int n,m,x,y;
bitset <Nmax2> viz;
bitset <Nmax> used;
vector <int> G[Nmax],sol;
edge E[Nmax2];

void DFS(int node) {

    used[node]=1;

    for (auto x: G[node])
        if (!viz[x]) {

            viz[x]=1;
            DFS(E[x].first+E[x].second-node);
        }

    sol.push_back(node);
}

bool AdmiteCiclu() {

    for (int i=1; i<=n; ++i)
        if (G[i].size()%2) return 0;
    return 1;
}

void ReadInput() {

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

        f>>x>>y;
        G[x].push_back(i);
        G[y].push_back(i);
        E[i].first=x;
        E[i].second=y;
    }
}

void Solve() {

    if (!AdmiteCiclu()) {
        g<<-1<<'\n';
        return;
    }

    DFS(1);
    for (int i=1; i<=n; ++i)
        if (!used[i]) {
            g<<-1<<'\n';
            return;
        }

    for (auto x: sol) g<<x<<' ';
    g<<'\n';
}

int main() {

    ReadInput();
    Solve();

    f.close(); g.close();
    return 0;
}