Cod sursa(job #1648775)

Utilizator edim98Eduard Constantinescu edim98 Data 11 martie 2016 11:37:45
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
#define N 100000

using namespace std;

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

int n, m;
int grad[N + 1];
vector <int> Graf[N + 1], sol;
bitset <N + 1> viz;
stack <int> S;

void Add(int x, int y)
{
    Graf[x].push_back(y);
    grad[x]++;
}

void Citire()
{
    int x, y;

    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        fin >> x >> y;
        Add(x, y);
        Add(y, x);
    }
}

bool verificare_grade()
{
    for(int i = 1; i <= n; i++)
        if(grad[i]%2 != 0)
            return false;
    return true;
}

void DFS(int nod)
{
    viz[nod] = true;
    for(int i = 0, vecin; i < Graf[nod].size(); i++)
    {
        vecin = Graf[nod][i];
        if(!viz[vecin])
            DFS(vecin);
    }
}

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

void Euler()
{
    S.push(1);
    while(!S.empty())
    {
        int nod = S.top();
        if(!Graf[nod].size())
        {
            sol.push_back(nod);
            S.pop();
            continue;
        }
        int vecin = Graf[nod].back();
        S.push(vecin);
        Graf[nod].pop_back();
        Graf[vecin].erase(find(Graf[vecin].begin(), Graf[vecin].end(), nod));
    }
}

void Afisare()
{
    for(int i = 0; i < sol.size()-1; i++)
        fout << sol[i] << " ";
}

int main()
{
    Citire();

    if(verificare_grade() == 0)
    {
        fout << "-1";
        return 0;
    }
    if(verificare_conex() == 0)
    {
        fout << "-1";
        return 0;
    }

    Euler();

    Afisare();

    return 0;
}