Cod sursa(job #2477399)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 20 octombrie 2019 11:31:52
Problema Ciclu Eulerian Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

const int Nmax = 100000, Mmax = 500000;

vector <pair <int, int>> g[Nmax + 5];
vector <int> sol;
stack <int> st;
bool useN[Nmax + 5], use[Mmax + 5];
int n, m, grad[Nmax + 5];

void Read(){
    fin >> n >> m;
    for (int i = 1; i <= m; i++){
        int x, y;
        fin >> x >> y;
        g[x].push_back(make_pair(y, i));
        g[y].push_back(make_pair(x, i));
        grad[x]++; grad[y]++;
    }
}

void DFS(int nod){
    useN[nod] = 1;
    for (auto i : g[nod])
        if (!useN[i.first])
            DFS(i.first);
}

int Check(){
    DFS(1);
    for (int i = 1; i <= n; i++)
        if (grad[i] && (!useN[i] || grad[i] % 2))
            return 0;
    return 1;
}

void Cycle(int nod){
    int vecin = 0;
    for (auto i : g[nod])
        if (!use[i.second]){
            use[i.second] = 1;
            vecin = i.first;
            break;
        }
    if (!vecin)
        return;
    st.push(vecin);
    Cycle(vecin);
}

void Solve(){
    int nod = 1;
    do{
        Cycle(nod);
        nod = st.top();
        st.pop();
        sol.push_back(nod);
    }while (!st.empty());
}

void Print(){
    for (auto i : sol)
        fout << i << ' ';
    fout << '\n';
}

int main(){
    Read();
    if (!Check()){
        fout << "-1\n";
        return 0;
    }
    Solve();
    Print();
    return 0;
}