Cod sursa(job #1252126)

Utilizator blue_skyPetrica Stefan Cosmin blue_sky Data 30 octombrie 2014 14:19:25
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <stack>
#include <queue>
#include <list>
#define DIM 100000

using namespace std;

stack <int> s;
queue <int> cd;
list <int> nod[DIM];
bool viz[DIM];
int n,m,x,y;


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

int verif_eul(int x)
{
    viz[x]=1;
    cd.push(x);
    while(!cd.empty())
    {
        int k=cd.front();
        for(list<int>::iterator i=nod[k].begin();i!=nod[k].end();++i)
        {
            if(!viz[*i])
            {
                viz[*i]=1;
                cd.push(*i);
            }
        }
        cd.pop();
    }
    for(int i=1;i<=n;++i)
    if(viz[i]!=1) return 0; //graficul nu e conex
    for(int i=1;i<=n;++i)
    if(nod[i].size()%2!=0) return 0; //nodurile nu au grad par
    return 1;
}

void stergere(int a,int b)
{
    for(list<int>::iterator i=nod[b].begin();i!=nod[b].end();++i)
    {
        if(*i==a)
        {
            nod[b].erase(i);
            break;
        }
    }
    nod[a].pop_front();
}

void parcurgere(int x)
{
     s.push(x);
     while(!s.empty())
     {
         int vf =s.top();
         if(nod[vf].empty())
         {
             g<<vf<<" ";
             s.pop();
         }
         else
         {
             int pn=nod[vf].front();
             stergere(vf,pn);
             s.push(pn);
         }
     }
}


int main()
{
    f>>n>>m;
    for(int i=1;i<=m ;++i)
    {
        f>>x>>y;
        nod[x].push_back(y);
        nod[y].push_back(x);
    }
    if(!verif_eul(1))
    g<<"-1\n";

    parcurgere(1);
    return 0;
}