Cod sursa(job #2768854)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 12 august 2021 13:19:11
Problema Ciclu Eulerian Scor 80
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
#include<stdlib.h>
#define P 100001
typedef struct M {
    int i;
    struct M *u;
}N;
int i,n,m,j,t,e,f,u,v,h,a[5*P],b[5*P],w[P],*g[P],c[P],s[P];
N *l,*r,*p,*q,*x;
int main()
{
	freopen("ciclueuler.in","r",stdin),freopen("ciclueuler.out","w",stdout),scanf("%d%d",&n,&m);
	for(i=0;i<m;++i)
    	scanf("%d%d",a+i,b+i),++w[a[i]],++w[b[i]];
	for(i=1;i<=n;w[i++]=0)
    	g[i]=(int*)malloc(4*w[i]);
	for(i=0;i<m;i++)
    	g[a[i]][w[a[i]]++]=b[i],g[b[i]][w[b[i]]++]=a[i];
	for(c[1]=s[1]=s[0]=1;s[0];)
        for(j=s[s[0]--],i=0;i<w[j];i++)
            if(!c[g[j][i]])
                c[g[j][i]]=1,s[++s[0]]=g[j][i];
	for(i=1;i<=n&&!f;i++)
        if(!c[i]||w[i]%2)
            printf("-1"),f=1;
	if(!f) {
		l=(N*)malloc(sizeof(N));
      	for(l->i=v=1,l->u=NULL;v;v=u,u=0)
            for(r=l;r&&!u;r=r->u)
                if(w[r->i]) {
                    u=1,p=r,q=r->u;
                    do {
                        for(j=g[p->i][--w[p->i]],h=t=0;t<w[j]&&!h;t++)
                            if(g[j][t]==p->i)
                                for(h=1,e=t;e<w[j]-1;e++)
                                    g[j][e]=g[j][e+1];
                        x=(N*)malloc(sizeof(N));
                        x->i=j,x->u=NULL,p->u=x,p=x,w[j]--;
                    }while(x->i!=r->i);
                    p->u=q;
                }
      	for(r=l->u;r;r=r->u)
            printf("%d ",r->i);
	}
	return 0;
}