Cod sursa(job #1968990)

Utilizator TibixbAndrei Tiberiu Tibixb Data 18 aprilie 2017 08:26:41
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 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, x, y;
int nod, fiu, mch;
int g[NMAX];
bool first;
bool u[MMAX];
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);
        }
    }
}
bool check_euler()
{
    for(int i = 1; i <= n; i++)
    {
        if(g[i] % 2 == 1)
        {
            _cout << "-1";
            return 0;
        }
        if(g[i] > 0 && u[i] == 0)
        {
            _cout << "-1";
            return 0;
        }
    }
    return 1;
}

void reinit()
{
    memset(u, 0, sizeof(u));
}

void euler()
{
    s.push(1);
    first = 1;

    while(!s.empty())
    {
        nod = s.top();

        if(g[nod] == 0)
        {
            if(first)
            {
                first = 0;
            }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(int 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]++;
    }
    for(int i = 1; i <= n; i++)
    {
        if(u[i] == 0)
        {
            dfs(i);
            break;
        }
    }
    if(check_euler())
    {
        reinit();
        euler();
    }
    return 0;
}