Cod sursa(job #394436)

Utilizator lorandCsorba Lorand-Alexandru lorand Data 10 februarie 2010 21:39:07
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
using namespace std;
#include<fstream>
ofstream fout("ciclueuler.out");
struct nod
{
    int vf;
    nod* next;
};
int n,m,*v,*d,*coada,solutie=1,dr;
nod* G[100003];
void addarc(int,int);
void euler(int);
void sterge(int,int);
int main()
{
    nod *p;
    int i,x,y;
    ifstream fin("ciclueuler.in");
    fin>>n>>m;
    d=new int[n+1];
    for(i=1;i<=n;++i)
       d[i]=0;
    for(i=1;i<=m;++i)
    {
        fin>>x>>y;
        addarc(x,y);
        addarc(y,x);
        ++d[x];
        ++d[y];
    }
    for(i=1;i<=n;++i)
       if(d[i]%2)
       {
           solutie=0;
           break;
       }
    if(solutie)
    {
        v=new int[n+1];
        for(i=1;i<=n;++i)
           v[i]=0;
        x=y=1;
        coada=new int[n+m];
        coada[x]=1;
        v[1]=1;
        while(x<=y)
        {
            for(p=G[coada[x]];p;p=p->next)
               if(v[p->vf]==0)
               {
                   coada[++y]=p->vf;
                   v[p->vf]=1;
               }
            ++x;
        }
        for(i=1;i<=n;++i)
           if(v[i]==0)
           {
               solutie=0;
               break;
           }
    }
    if(solutie)
    {
               euler(1);
               for(i=1;i<dr;++i)
                  fout<<coada[i]<<' ';
    }
    else
      fout<<-1;    
    return 0;
}
void addarc(int i,int j)
{
    nod *p=new nod;
    p->vf=j;
    p->next=G[i];
    G[i]=p;
}
void euler(int i)
{
    int x;
    nod *p;
    p=G[i];
    while(p)
    {
            if(p->vf!=-1)
            {
                         x=p->vf;
                         sterge(i,p->vf);
                         euler(x);
            }
            p=p->next;
    }
    coada[++dr]=i;
}
void sterge(int i,int j)
{
    nod *p;
    for(p=G[i];p;p=p->next)
       if(p->vf==j)
       {
                   p->vf=-1;
                   break;
       }
    for(p=G[j];p;p=p->next)
       if(p->vf==i)
       {
                   p->vf=-1;
                   break;
       }
}