Cod sursa(job #539062)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 22 februarie 2011 12:34:22
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include<stdio.h>
#include<stdlib.h>
#define N 100001
#define M 500001
typedef struct stack
{long st[N],sp;};
typedef struct nod
{long info;
nod *next;}Nod,*list;
long a[M],b[M],i,j,k,n,m,s[N]={0},t=0,c[M]={0},r,p;
list g[N];
stack q;

void push(stack &q,long x)
{q.st[++q.sp]=x;}

long pop(stack &q)
{return q.st[q.sp--];}

void add(list &q,long x)
{Nod *nou=new Nod;
nou->info=x;
nou->next=q;
q=nou;}

int grade_pare(list g[N],long n)
{long i=1,s=0;
list p;
int gasit=0;
while(i<=n&&!gasit)
      {for(p=g[i];p!=NULL;p=p->next)
             s++;
      if(s%2==1)
             gasit=1;
      i++;}
return (!gasit);}

void df(list g[N],long i)
{long j;
list p;
stack q;
q.sp=0;
push(q,i);
while(q.sp!=0)
       {j=pop(q);
       s[j]=1;
       for(p=g[j];p!=NULL;p=p->next)
       if(s[p->info]==0)
              push(q,p->info);}}

int conex(list g[N],long s[N])
{long i;
int gasit=0;
df(g,1);
for(i=1;i<=n;i++)
if(s[i]==0)
      gasit=1;
return (!gasit);}

int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%ld%ld\n",&n,&m);
for(j=1;j<=n;j++)
      g[j]=NULL;
for(i=1;i<=m;i++)
      {scanf("%ld%ld\n",&a[i],&b[i]);
      add(g[a[i]],b[i]);
      add(g[b[i]],a[i]);}
if(conex(g,s)==1&&grade_pare(g,n)==1)
      {q.sp=0;
      push(q,1);
      r=0;
      i=0;
      t=0;
      while(q.sp!=0)
             {j=i;
             i=pop(q);
             if(r>0&&c[r]==0&&((a[r]==i&&b[r]==j)||(a[r]==j&&b[r]==i)))
                    {printf("%ld ",i);
                    c[r]=1;
                    t++;}
             for(k=m;k>=1&&((c[r]==1&&r>0)||(r==0));k--)
             if(c[k]==0&&a[k]==i)
                    {push(q,b[k]);
                    r=k;}
             else
                    if(c[k]==0&&b[k]==i)
                           {r=k;
                           push(q,a[k]);}}}
else
      printf("-1");
fclose(stdin);
fclose(stdout);
return 0;}