Cod sursa(job #1784056)

Utilizator SmitOanea Smit Andrei Smit Data 19 octombrie 2016 19:08:47
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<bits/stdc++.h>

using namespace std;

ofstream fout("ciclueuler.out");

int n,m,st[500003],top,sol[500003],ind;
vector<int>L[100003];

void Citire()
{
    int i,x,y;
    ifstream fin("ciclueuler.in");
    fin>>n>>m;
    for(i=1;i<=m;++i)
    {
        fin>>x>>y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
    fin.close();
}

void Euler()
{
    int i,nod,x;
    unsigned int ui;
    for(i=1;i<=n;++i)
        if(L[i].size()%2==1)
        {
            fout<<"-1\n";
            exit(0);
        }
    //sol
    ind=0;
    top=0;
    st[++top]=1;
    while(top>0)
    {
        nod=st[top];
        if(L[nod].size()>0)//daca am vecini, sterg o muchie
        {
            x=L[nod][0];
            L[nod].erase(L[nod].begin());
            for(ui=0;ui<L[x].size();++ui)
            {
                if(L[x][ui]==nod)
                {
                    L[x].erase(L[x].begin() + ui);
                    ui=L[x].size()+1;//break;
                }
            }
            st[++top]=x;
        }
        else
        {
            top--;
            sol[++ind]=nod;
        }
    }
}

void Afisare()
{
    int i;
    for(i=1;i<=ind;++i)
        fout<<sol[i]<<" ";
    fout<<"\n";
}

int main()
{
    Citire();
    Euler();
    Afisare();
    return 0;
}