Cod sursa(job #2480387)

Utilizator Dragos1226Dragos Chileban Dragos1226 Data 25 octombrie 2019 14:48:30
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
const int NMax = 100000;
const int MMax = 500000;
vector <int> G[NMax+5], Sol;
stack <int> S;
struct Edges {int x, y;}V[MMax+5];
int N, M, Use[MMax+5], Viz[NMax+5];

void Read() {
    in >> N >> M;
    for(int i = 1, x, y; i <= M; i++) {
        in >> x >> y;
        G[x].push_back(i);
        G[y].push_back(i);
        V[i] = {x,y};
    }
}

int Vec(int Nod, int m) {
    if(Nod == V[m].x)
        return V[m].y;
    return V[m].x;
}

void DFS(int Nod) {
    Viz[Nod] = 1;
    for (auto m : G[Nod]) {
        int Vecin = Vec(Nod,m);
        if (!Viz[Vecin])
            DFS(Vecin);
    }
}

bool Check () {
    DFS(1);
    for (int i = 1; i <= N; i++)
        if(!Viz[i] || G[i].size() % 2)
            return 0;
    return 1;
}



void Cycle(int Nod) {

    while(G[Nod].size()) {
        int m = G[Nod].back();G[Nod].pop_back();

        if(!Use[m]) {
            Use[m] = 1;
            int Vecin = Vec(Nod,m);
            cout << Nod << " " << Vecin << "\n";
            S.push(Nod);
            Nod = Vecin;
        }
    }
}

void Solve () {
    int Nod = 1;
    do {
        Cycle(Nod);
        Nod = S.top();S.pop();
        Sol.push_back(Nod);
    }
    while(!S.empty());

}

void Print() {
    for(auto i : Sol)
        out << i << " ";
    out << '\n';
}

int main() {
    Read();
    if(!Check()) {
        out << -1 << '\n';
        return 0;
    }

    Solve();
    Print();
}