Cod sursa(job #1902996)

Utilizator TibixbAndrei Tiberiu Tibixb Data 4 martie 2017 21:53:57
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<fstream>
#include<vector>
#include<stack>
#include<cstring>
#define NMAX 100005
#define MMAX 500005
using namespace std;
vector<pair<int, int> > G[NMAX];
stack<int> s;
int n, m, i, x, y;
int g[NMAX];
bool u[MMAX];
int nod;
bool prim;
int fiu, mch;
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
void dfs(int nod)
{
    u[nod] = 1;
    for(int i = 0; i < G[nod].size(); i++)
    {
        int fiu = G[nod][i].first;
        if(u[fiu] == 0)
        {
            dfs(fiu);
        }
    }
}
void reinit()
{
    memset(u, 0, sizeof(u));
}
void euler()
{
    s.push(1);
    while(!s.empty())
    {
        nod = s.top();
        if(g[nod] == 0)
        {
            if(!prim)
            {
                prim = 1;
            }else
            {
                cout << nod << " ";
            }
            s.pop();
            continue;
        }

        while(u[G[nod].back().second] == 1)
        {
            G[nod].pop_back();
        }

        fiu = G[nod].back().first;
        mch = G[nod].back().second;
        u[mch] = 1;
        g[nod]--;
        g[fiu]--;
        s.push(fiu);
    }
}
int main()
{
    cin >> n >> m;
    for(i = 1; i <= m; i++)
    {
        cin >> x >> y;
        G[x].push_back(make_pair(y, i));
        G[y].push_back(make_pair(x, i));
        g[x]++;
        g[y]++;
    }
    dfs(1);
    for(i = 1; i <= n; i++)
    {
        if(g[i] % 2 == 1)
        {
            cout << "-1";
            return 0;
        }
        if(u[i] == 0 && g[i] > 0)
        {
            cout << "-1";
            return 0;
        }
    }
    reinit();
    euler();
    return 0;
}