Cod sursa(job #917553)

Utilizator andrettiAndretti Naiden andretti Data 18 martie 2013 09:05:33
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<stdio.h>
#include<list>
#include<vector>
#include<stack>
#define pb push_back
#define maxn 100005
using namespace std;

int n,m;
int g[maxn],v[maxn];
list <int> l[maxn];
stack <int> s;
vector <int> sol;

void cit()
{
    int i;
    int x,y;

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        l[x].pb(y);
        l[y].pb(x);
        g[x]++; g[y]++;
    }
}

void df(int k)
{
    v[k]=1;

    for(list<int>::iterator it=l[k].begin();it!=l[k].end();it++)
       if(v[*it]==0)
         df(*it);
}

int verif()
{
    int i;

    df(1);
    for(i=1;i<=n;i++)
        if(v[i]==0 || g[i]%2!=0)
            return 0;
    return 1;
}

void del(int k,int val)
{
    list<int>::iterator it;
    it=l[k].begin();
    while(*it!=val) it++;
    l[k].erase(it);
}

void euler(int k)
{
    list<int>::iterator it;
    int p,i;

    p=k;
    do
    {
        it=l[p].begin();
        i=*it;
        g[p]--; g[i]--;
        l[p].pop_front();
        del(i,p);

        s.push(i);
        p=i;
    }while(p!=k);
}

void solve()
{
    int k;

    s.push(1);
    while(!s.empty())
    {
        k=s.top();
        if(g[k]==0) { sol.pb(k); s.pop();}
        else
         euler(k);
    }

    for(unsigned int i=0;i<sol.size();i++)
     printf("%d ",sol[i]);
}

int main()
{
    freopen("ciclueulerian.in","r",stdin);
    freopen("ciclueulerian.out","w",stdout);

    cit();
    if(verif()) solve();
   else
     printf("-1");

    fclose(stdin);
    fclose(stdout);
    return 0;
}