Cod sursa(job #715051)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 16 martie 2012 16:07:36
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <stack>

using namespace std;

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

struct node
{
    int nr;
    node *next;
} *v[100005];

int n,m,grad[100005],nr;
stack<int> st;

void adauga(int a, int b)
{
    node *p=new node;
    p->nr=b;
    p->next=v[a];
    v[a]=p;
    ++grad[a];
}

int main()
{
    int i,a,b,w;
    node *p;
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>a>>b;
        adauga(a,b);
        adauga(b,a);
    }
    for(i=1;i<=n;++i)
        if(grad[i]%2)
        {
            g<<-1<<'\n';
            f.close(); g.close();
            return 0;
        }
    st.push(1);
    while(!st.empty())
    {
        i=st.top();
        if(!v[i])
        {
            st.pop();
            ++nr;
            if(nr<=m) g<<i<<' ';
        }
        else
        {
            w=v[i]->nr;
            v[i]=v[i]->next;
            st.push(w);
            p=v[w];
            if(p->nr==i) v[w]=v[w]->next;
            else
            {
                while(p->next->nr!=i) p=p->next;
                p->next=p->next->next;
            }
        }
    }
    g<<'\n';
    f.close(); g.close();
    return 0;
}