Cod sursa(job #775216)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 7 august 2012 15:49:48
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<stdio.h>
const int white=0;
const int gray=1;
const int black=2;
const int tree=0;
const int back=1;
using namespace std;



int n,m,i,j,color[100001],viz[500001],type[500001],grad[100001];
struct lista
{int nod;
 int index;
 lista* next;};
lista* a[500001]; 

void add(int xx, int yy, int ind)
{lista* q = new lista;
 q->nod=yy;
 q->index=ind;
 q->next=a[xx];
 a[xx]=q;}


void depth(int x)
{lista* q=a[x];
color[x]=gray;
while(q)
{if(color[q->nod]==white && viz[q->index]==0)
   {viz[q->index]=1;  depth(q->nod);
    type[q->index]=tree;}
 if(color[q->nod]!=white && viz[q->index]==0)
  {viz[q->index]=1;
   type[q->index]=back;
   }
q=q->next;}
color[x]=black;
}

int conex()
{for(j=1; j<=n; j++)
     if(color[j]==white)
       return 0;
 return 1;      
}

int eulerian()
{int nr,poz;
 nr=0;
 for(j=1; j<=n; j++)
    {if(grad[j]%2==1)
       {nr++;  poz=j;}
     if(nr>2)
       return -1;}
 if(nr==1)
   return -1;
 if(nr==2)
   return -1;
 if(nr==0)
   return 0;         
}   

int sx,sy,nextx;

void eulerian_path(int x)
{
lista*q;
lista* w;
m--;
while(m)
{q=a[x];
while(q)
{if(viz[q->index]==1)
   {w=q;
    if(type[q->index]==back)
        break;}
q=q->next;}

nextx=w->nod;
sx=x;
sy=w->nod;
viz[w->index]=2;

printf("%d ",sy);
x=nextx;
m--;}

}

int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d %d",&n,&m);
int aa,bb;
for(i=1; i<=m; i++)
  {scanf("%d %d",&aa,&bb);
  add(aa,bb,i);
  add(bb,aa,i);
  grad[aa]++;
  grad[bb]++;}
depth(1);
if(conex()==0 || eulerian()==-1)
   printf("-1");
else   
{/*if(eulerian()!=0)
   {g<<eulerian()<<" ";
    eulerian_path(eulerian());}  
else    
{*/
printf("1 ");
eulerian_path(1);
//}
}

return 0;
}