Cod sursa(job #928215)

Utilizator maritimCristian Lambru maritim Data 26 martie 2013 12:38:12
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<stdio.h>
#include<vector>
#include<fstream>
using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

#define MaxN 100100
#define MaxM 500100

int N,M;
vector<pair<int,int> > A[MaxN];
int SolV[MaxM];
int viz[MaxM],St[MaxM],StPoz[MaxM];

void citire(void)
{
    int a,b;

    f >> N >> M;
    for(int i=1;i<=M;i++)
    {
        f >> a >> b;
        A[a].push_back(make_pair(b,i));
        A[b].push_back(make_pair(a,i));
    }
}

inline void DF(int a)
{
    viz[a] = 1;

    for(int i=0;i<A[a].size();i++)
        if(!viz[A[a][i].first])
            DF(A[a][i].first);
}

inline int esteEuler(void)
{
    DF(1);
    
    for(int i=1;i<=N;i++)
        if(!viz[i])
            return 0;
        else
            viz[i] = 0;

    for(int i=1;i<=N;i++)
        if(A[i].size()%2)
            return 0;

    return 1;
}

void euler(void)
{
    int k = 1;

    St[k] = 1;
    StPoz[k] = 0;

    for(;k;StPoz[k]++)
    {
        if(StPoz[k] < A[St[k]].size())
        {
            if(!viz[A[St[k]][StPoz[k]].second])
            {
                viz[A[St[k]][StPoz[k]].second] = 1;
                St[k+1] = A[St[k]][StPoz[k]].first;
                StPoz[++k] = -1;
            }
        }
        else
        {
            //printf("%d ",St[k]);
            SolV[++SolV[0]] = St[k--];
        }
    }
}

int main()
{
    citire();

    if(!esteEuler())
        g << -1;
    else
    {
        euler();
        for(int i=1;i<SolV[0];i++)
            g << SolV[i] << " ";
    }
}