Cod sursa(job #1872976)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 8 februarie 2017 18:34:11
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

vector<int> v[100010];
int from[500010], to[500010];
bitset<500010> used_edge;
int n,m;

int main()
{
    int x, y;
    fin>>n>>m;
    /// folosim altfel vector<int> v[]; stocam nu la ce nod merge, ci indicele muchiei care incepe in x
    /// muchia i are 2 componente: from[i] si to[i]
    for(int i=1;i<=m; i++)
    {
        fin>>x>>y;
        v[x].push_back(i);
        v[y].push_back(i);
        from[i] = x;
        to[i] = y;
    }
    for(int i=1;i<=n;i++)
        if(v[i].size() % 2 == 1)
        {
            fout<<-1;
            return 0;
        }
    vector<int> ans;
    vector<int> stk;
    stk.push_back(1);
    while(!stk.empty())
    {
        int node = stk.back();
        if(!v[node].empty())
        {
            int e = v[node].back();
            v[node].pop_back();
            if(!used_edge[e])
            {
                used_edge[e] = 1;
                if(node == from[e])
                    stk.push_back(to[e]);
                else
                    stk.push_back(from[e]);
            }
        }
        else
        {
            stk.pop_back();
            ans.push_back(node);
        }
    }
    for(int i=0; i<ans.size() - 1; i++)
        fout<<ans[i]<<' ';

    return 0;
}