Cod sursa(job #1218388)

Utilizator andreimdvMoldovan Andrei andreimdv Data 10 august 2014 20:42:35
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<fstream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

vector<int> v[100010];
int grad[100010];
int coada[100010],ls,nod,ld,i,vizitat[100010],noduri,a,b,aux,n,m;
stack<int> st;
bool conex()
{
    coada[ls=ld=1]=1;
    vizitat[1]=1;
    noduri=1;
    while(ls<=ld)
    {
        aux=coada[ls++];
        for(unsigned i=0;i<v[aux].size();++i)
        {
            if(vizitat[v[aux][i]]==0)
            {
                vizitat[v[aux][i]]=1;
                coada[++ld]=v[aux][i];
                noduri++;
            }
        }
    }
    if(noduri==n)
    return true;
    return false;
}
bool gradpar()
{
    for(i=1;i<=n;++i)
    if(grad[i]%2!=0)
    return false;
    return true;
}
void cautaciclu()
{
    st.push(1);
    while(!st.empty())
    {
        aux=st.top();
        if(v[aux].size())
        {
            nod=v[aux].back(); v[aux].pop_back();
            st.push(nod);
            v[nod].erase(find(v[nod].begin(),v[nod].end(),aux));
        }
        else
        {
            st.pop();
            if(!st.empty()) fout<<aux<<" ";
        }
    }

}
int main()
{
    fin>>n>>m;
    for(i=1;i<=m;++i)
    {
        fin>>a>>b;
        grad[a]++; grad[b]++;
        v[a].push_back(b); v[b].push_back(a);
    }
    if(conex()&& gradpar())
    {
        cautaciclu();
        return 0;
    }
    fout<<"-1";


    return 0;
}