Cod sursa(job #984531)

Utilizator danalex97Dan H Alexandru danalex97 Data 14 august 2013 18:24:15
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <algorithm>
#include <fstream>
#include <vector>
#include <list>
using namespace std;

#define nod1 first
#define nod2 second
typedef pair<int,int> Pair;

#define IT(type) vector<type>::iterator
#define LT(type) list<type>::iterator

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

const int Nmax = 100010;
const int Mmax = 500010;

Pair Edge[Mmax];
int N,M,Grad[Nmax];
list<int> V[Nmax];
int Mark[Mmax];

int Good_graph()
{
    for (int i=1;i<=N;++i)
        if ( Grad[i] % 2 == 1 )
            return 0;
    return 1;
}

vector<int> cycle;
LT(int) it[Nmax];

void Make_cycle(int nod)
{
    while ( it[nod] != V[nod].end() )
        if ( Mark[*it[nod]] == 0 )
        {
            Mark[*it[nod]] = 1;
            int where = Edge[*it[nod]].nod1 + Edge[*it[nod]].nod2 - nod;
            ++it[nod];
            Make_cycle( where );
        }
        else
            ++it[nod];
    cycle.push_back( nod );
}

int main()
{
    F>>N>>M;
    for (int i=1;i<=M;++i)
    {
        F>>Edge[i].nod1>>Edge[i].nod2;
        V[ Edge[i].nod1 ].push_back( i );
        V[ Edge[i].nod2 ].push_back( i );
        Grad[Edge[i].nod1]++;
        Grad[Edge[i].nod2]++;
    }

    if ( Good_graph() == 0 )
    {
        G<<"-1\n";
        return 0;
    }

    for (int i=1;i<=N;++i)
        it[i] = V[i].begin();
    Make_cycle(1);

    reverse(cycle.begin(),cycle.end());
    for (unsigned int i=0;i<cycle.size()-1;++i)
        G<<cycle[i]<<' ';
    G<<'\n';
}