Cod sursa(job #2072138)

Utilizator RaduToporanRadu Toporan RaduToporan Data 21 noiembrie 2017 14:33:27
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <vector>
#include <stack>

using namespace std;
int n,m,i,x,y,start,nrmuchie,nod,e[500005],nrnod;
struct element
{
    int y,nrmuchie;
} e1,e2;
bool viz[500005],eulerian;

vector <element> v[100005];
stack <int>st;

element make_elem(int y, int nrmuchie)
{
    element elem;
    elem.y=y;
    elem.nrmuchie=nrmuchie;
    return elem;
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1; i<=m; i++)
    {
        scanf("%d%d",&x,&y);
        e1=make_elem(y,i);
        e2=make_elem(x,i);
        v[x].push_back(e1);
        v[y].push_back(e2);
        start=x;
    }
    eulerian=true;
    for (i=1; i<=n&&eulerian==true; i++)
        if (v[i].size()%2==1) eulerian=false;
    if (eulerian==false) printf("-1\n");
        else
    {
        st.push(start);
        while (st.size()>0)
        {
            nod=st.top();
            if (v[nod].size()>0)
            {
                while(v[nod].size()>0 && viz[v[nod].back().nrmuchie]==1)
                    v[nod].pop_back();

                if (v[nod].size()>0)
                {
                    y=v[nod].back().y;
                    nrmuchie=v[nod].back().nrmuchie;
                    st.push(y);
                    viz[nrmuchie]=1;
                }
            }
        else
            {
                e[++nrnod]=st.top();
                st.pop();
            }
        }
        if (nrnod-1!=m)
            printf("-1\n");
        else
            for (i=1; i<=nrnod-1; i++) printf("%d ",e[i]);
    }
    return 0;
}