Cod sursa(job #913040)

Utilizator cat_red20Vasile Ioana cat_red20 Data 13 martie 2013 08:17:05
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 100000
#define MAXM 500000
using namespace std;
vector <int> v[MAXN+1];
int c[MAXM+2],c1[MAXM+2],m,n,p;

void citire()
{
    int x,y;
    freopen("ciclueuler.in","r",stdin);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
}

int par()
{
    int s;
   for(int i=1;i<=n;i++)
   {
       s=v[i].size();
       if(s%2==1 || s==0)
        return 0;
   }
   return 1;
}

int conex()
{
    int q[MAXN+1],viz[MAXN+1],p,u;
    p=1;
    u=1;
    memset(viz,0,sizeof(viz));
    q[1]=1;
    viz[1]=1;
    vector <int>::iterator it;
    while(p<=u)
    {
        for(it=v[q[p]].begin();it!=v[q[p]].end();it++)
        {
            if(viz[(*it)]==0)
            {
                q[++u]=(*it);
                viz[q[u]]=1;
            }
        }
        p++;
    }
    if(u==n)
        return 1;
    return 0;
}

void sterge(int x,int y)
{
    vector<int>:: iterator it;
    for(it=v[x].begin();it!=v[x].end();it++)
    {
        if((*it)==y)
        {
            v[x].erase(it);
            break;
        }
    }
}

int cicluNou(int st)
{
    int p1;
    c1[1]=st;
    p1=1;
    do
    {
        p1++;
        c1[p1]=v[c1[p1-1]].front();
        v[c1[p1-1]].erase(v[c1[p1-1]].begin());
        sterge(c1[p1],c1[p1-1]);
    }while(c1[p1]!=st);
    return p1;
}

void deplasare(int poz,int l)
{
    for(int i=p;i>=poz+1;i--)
    {
        c[i+l-1]=c[i];
    }
}

void intercl(int poz,int l)
{
    for(int i=1;i<=l;i++)
    {
        c[i+poz-1]=c1[i];
    }
}

void ciclu()
{
    int l;
    p=1;
    c[1]=1;
    vector <int>::iterator it;
    do
    {
        c[++p]=v[c[p-1]].front();
        v[c[p-1]].erase(v[c[p-1]].begin());
        sterge(c[p],c[p-1]);

    }while(c[p]!=1);

    while(p<=m-1)
    {
        for(int i=1;i<=p-1;i++)
        {
            if(!v[c[i]].empty())
            {
               l=cicluNou(c[i]);
               deplasare(i,l);
               intercl(i,l);
               p+=l-1;
            }
        }
    }
}

void afisare()
{
    for(int i=1;i<=p;i++)
    {
        printf("%d ",c[i]);
    }
}

int main()
{
    freopen("ciclueuler.out","w",stdout);
    citire();
    if(!par() || !conex())
    {
        printf("-1");
        return 0;
    }
    ciclu();
    afisare();
    return 0;
}