Cod sursa(job #1640883)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 8 martie 2016 19:45:29
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <stdio.h>
#include <queue>
#include <vector>
#include <algorithm>
#include <stack>
#include <bitset>
#define nmax 100001
using namespace std;

stack<int> s;
vector<int> m[nmax];
queue<int> q;
bitset<nmax> viz;
int n,m1;

int is_euler()
{
    int nod;
    vector<int>::iterator it;
    if(m[1].size()%2==1) return 0;
    q.push(1); viz[1]=1;
    int nrvf=1;
    while(!q.empty())
    {
        nod=q.front(); q.pop();
        for(it=m[nod].begin();it!=m[nod].end();it++)
        {
            if(m[*it].size()%2==1) { return 0; break; }
            if(!viz[*it]) { viz[*it]=1; nrvf++; q.push(*it); }
        }
    }
    if(nrvf==n) return 1;
           else return 0;
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d %d",&n,&m1);
    int i,x,y,nod,aux;
    for(i=1;i<=m1;i++)
    {
        scanf("%d %d",&x,&y);
        m[x].push_back(y);
        m[y].push_back(x);
    }

    if(!is_euler()) { printf("-1\n"); return 0; }

    s.push(1);
    while(!s.empty())
    {
        nod=s.top();
        if(!m[nod].size())
        {
            s.pop();
            if(!s.empty())
                printf("%d ",nod);
        }
        else
        {
            aux=m[nod].back();
            m[nod].pop_back();
            m[aux].erase(find(m[aux].begin(),m[aux].end(),nod));
            s.push(aux);
        }
    }
    return 0;
}