Cod sursa(job #1468527)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 6 august 2015 11:58:35
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<fstream>
#define NM 100002
#define MM 500002
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int *a[NM];
int x[MM],y[MM];
int viz[NM];
int st[MM];
int vf,nr;
void df(int);
inline void swap(int &x,int &y)
{
    int aux=x;
    x=y;
    y=aux;
}
int n,m,grad[NM];
int main()
{
    f>>n>>m;
    int i,c,d;
    for(i=1;i<=m;i++)
    {
        f>>c>>d;
        x[i]=c;
        y[i]=d;
        grad[d]++;
        grad[c]++;
    }
    for(i=1;i<=n;i++)
    {
        a[i]=new int[grad[i]+1];
        a[i][0]=0;
    }
    for (i=1;i<=m;i++)
    {
         a[x[i]][0]++;
         a[x[i]][a[x[i]][0]]=y[i];
        a[y[i]][0]++;
         a[y[i]][a[y[i]][0]]=x[i];
    }
    df(1);
    for(i=1;i<=n;i++)
      if(grad[i]%2==1||viz[i]==0)
         {
             g<<"-1";
             return 0;
         }
    vf=1;
    st[vf]=1;
    int x,y;
    while(vf)
    {
        x=st[vf];
        if(a[x][0]==0)
        {
            nr++;
            if(nr<=m)
            {
                g<<x<<" ";
            }
            vf--;
            continue;
        }
        y=a[x][a[x][0]];
        if(y==x)
          a[x][0]--;
        for(i=1;i<=a[y][0];i++)
        {
            if (a[y][i]==x)
            {
                swap(a[y][i],a[y][a[y][0]]);
                break;
            }
        }
        if(y!=x)
          a[x][0]--;
        a[y][0]--;
        st[++vf]=y;
    }
    return 0;
}
void df(int k)
{
    viz[k]=1;
    int i;
    for(i=1;i<=a[k][0];i++)
    if(!viz[a[k][i]])
    {
        df(a[k][i]);
    }
}