Cod sursa(job #726669)

Utilizator hunter_ionutzzzFarcas Ionut hunter_ionutzzz Data 27 martie 2012 13:22:53
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct nod{int val;
           nod *next;
}*v[100005];
int n,m,grad[100005],nr;
stack<int> st;
inline void adauga(int a, int b)
{nod *q;
    q = new nod;
    q -> val = b;
    q -> next = v[a];
    v[a] = q;
    ++grad[a];
}
int main()
{int i,a,b;
 nod *q;
    fin >> n >> m;
    for(i=1;i<=m;++i)
    {   fin >> a >> b;
        adauga(a,b);
        adauga(b,a);
    }
    for(i=1;i<=n;++i)
        if (grad[i]%2)
        {   fout << -1 <<'\n';
            return 0;
        }
    st.push(1);
    while(!st.empty())
    {   i = st.top();
        if (!v[i])    //daca nu mai are vecini
        {   st.pop(); //este eliminat si afisat
            ++nr;     // nr este numarul de muchii
            if (nr <= m) 
				fout << i <<' ';
        }
        else
        {   a = v[i] -> val;     //se elimina cele 2 noduri
            v[i] = v[i] -> next;
            st.push(a);
            q = v[a];
            if (q -> val == i) 
				v[a] = v[a] -> next;
            else
            {   while (q -> next -> val != i) 
					q = q -> next;
                q -> next = q -> next -> next;
            }
        }
    }
    fout << '\n';
    return 0;
}