Cod sursa(job #1604988)

Utilizator BaweeLazar Vlad Bawee Data 18 februarie 2016 18:35:15
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>


using namespace std;

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

int n , m , x , y , g[100001] , nod , urmNod ;
stack<int> s;
vector<int> G[100001];
vector<int> ans;
bool viz[100001];

void dfs(int nod)
{
    viz[nod] = true;
    for(auto it = G[nod].begin(); it != G[nod].end(); ++it)
        if(!viz[*it])
            dfs(*it);
}

bool conex()
{
    dfs(1);
    for(int i = 1; i <= n; ++i)
        if(!viz[i])
            return false;
    return true;
}

int main()
{
    in >> n >> m;
    for(int i = 1; i <= m; ++i)
    {
        in >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
        g[x]++ , g[y]++;
    }

    bool flag = false;
    for(int i = 1; i <= n; ++i) if(g[i] % 2) flag = true , i = n + 1;

    if(!flag && conex())
    {
        s.push(1);

        while(!s.empty())
        {
            nod = s.top();
            if(G[nod].size())
            {
                urmNod = G[nod].back();
                s.push(urmNod);
                G[nod].pop_back();
                G[urmNod].erase(find(G[urmNod].begin() , G[urmNod].end() , nod));
            }
            else
            {
                nod = s.top();
                ans.push_back(nod);
                s.pop();
            }
        }
        flag = false;
        for(auto it = ans.begin(); it != ans.end(); ++it)
        {
            if(flag == false) flag = true;
            else out << *it << " ";
        }
    }
    else
        out << "-1 ";

    return 0;
}