Cod sursa(job #1506953)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 21 octombrie 2015 09:21:24
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>

#define MMAX 500007
#define NMAX 100007
#define DIM 10007
#define pb push_back

using namespace std;
int n, m, aux, sze, poz;
char viz[MMAX], buff[DIM];
struct muchie
{
    int x;
    int y;
} E[MMAX];
vector <int> adj[NMAX], sol;
stack <int> dfs;

void citeste(int &nr)
{
    nr = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
    {
        ++poz;
        if(poz == DIM)
        {
            fread(buff, 1, DIM, stdin);
            poz = 0;
        }
    }
    while(buff[poz] >= '0' && buff[poz] <= '9')
    {
        nr = nr*10 + buff[poz]-'0';
        ++poz;
        if(poz == DIM)
        {
            fread(buff, 1, DIM, stdin);
            poz = 0;
        }
    }
}


int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    citeste(n);
    citeste(m);
    for(int i = 1; i<= m; ++i)
    {
        citeste(E[i].x);
        citeste(E[i].y);
        adj[E[i].x].pb(i);
        adj[E[i].y].pb(i);
    }
    for(int i = 1; i<= n; ++i)
    {
        if(adj[i].size()&1)
        {
            printf("-1\n");
            return 0;
        }
    }
    dfs.push(1);
    while(!dfs.empty())
    {
        int nod = dfs.top();
        sze = adj[nod].size();
        while(viz[adj[nod][0]] && !adj[nod].empty())
        {
            swap(adj[nod][0], adj[nod][sze-1]);
            adj[nod].pop_back();
            --sze;
        }
        if(!sze)
        {
            sol.pb(nod);
            dfs.pop();
            continue;
        }
        viz[adj[nod][0]] = 1;
        if(nod != E[adj[nod][0]].x) aux = E[adj[nod][0]].x;
        else aux = E[adj[nod][0]].y;
        dfs.push(aux);
        swap(adj[nod][0], adj[nod][sze-1]);
        adj[nod].pop_back();
        --sze;
    }
    sze = sol.size();
    for(int i = 0; i< sze; ++i) printf("%d ", sol[i]);
    printf("\n");
    return 0;
}