Cod sursa(job #1969574)

Utilizator RaduToporanRadu Toporan RaduToporan Data 18 aprilie 2017 15:34:38
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <stack>

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

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

element make_elem(int y, int indice)
{
    element elem;
    elem.y=y;
    elem.indice=indice;
    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().indice]==1)
                v[nod].pop_back();

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