Cod sursa(job #2101950)

Utilizator LucaSeriSeritan Luca LucaSeri Data 8 ianuarie 2018 11:50:11
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 10;
const int MAXM = 500010;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

bool viz[MAXM];

vector< pair<int, int> > gr[MAXN];
int grad[MAXN];
vector<int> ans;

int main(){
    int n, m;
    f >> n >> m;
    for(int i = 1; i <= m; ++i){
        int a, b;
        f >> a >> b;
        gr[a].push_back({b, i});
        gr[b].push_back({a, i});
        grad[a] ++;
        grad[b] ++;
    }

    for(int i = 1; i <= n; ++i){
        if(grad[i]&1 || grad[i] == 0){
            g << -1;
            return 0;
        }
    }
    stack<int> dfs;
    dfs.push(1);
    while(dfs.size()){
        int node = dfs.top();
        if(gr[node].size()){
            int x = gr[node].back().first;
            int edge = gr[node].back().second;
            gr[node].pop_back();
            if(!viz[edge]){
                viz[edge] = true;
                dfs.push(x);
            }
        }else{
            dfs.pop();
            ans.push_back(node);
        }
    }
    for(int i = 0; i < ans.size()-1; ++i) g << ans[i] << ' ';
    return 0;
}