Cod sursa(job #1650765)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 11 martie 2016 20:21:25
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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;

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

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())
        {
            aux=m[nod].back();
            m[nod].pop_back();
            m[aux].erase( find(m[aux].begin(),m[aux].end(),nod));
            s.push(aux);
        }
        else
        {
            if(s.size()>1) printf("%d ",nod);
            s.pop();
        }
    }

    return 0;
}