Cod sursa(job #2768856)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 12 august 2021 13:21:52
Problema Ciclu Eulerian Scor 80
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>
#include<stdlib.h>
typedef struct M {
    int i;
    struct M *u;
}N;
int i,n,m,k,j,t,e,f,u,v,h,a[500001],b[500001],w[100001],*g[100001],c[100001],s[100001];
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(w[i]*sizeof(int));
	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);
	}
}