Cod sursa(job #2151299)

Utilizator dacianouaPapadia Mortala dacianoua Data 4 martie 2018 12:37:01
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define Nmax 100000
#define Mmax 500000
using namespace std;
FILE *fin,*fout;
int N,M,sol[Mmax+5],ciclu[Nmax+5],solf=0,grad[Nmax+5];
struct nod
{
    int info;
    nod *urm;
}*v[Nmax+5],*c,*e[Nmax+5];
void del_edge(int x, int y)
{
    c=v[y];
    nod *gg;
    while(c->urm)
    {
        gg=c;
        c=c->urm;
        if(c->info==x)
        {
            gg->urm=c->urm;
            break;
        }
    }
}
void euler(int x,int k)
{
    sol[k]=x;
    if(k==M)
        solf=1;
    else
    {nod *e=v[x],*del;
    int u=0,kaux=ciclu[x]+1;
    for(int i=k;i<k+kaux && ciclu[x];i++)
        sol[i]=x;
    while(e->urm && !solf)
    {
        del=e;
        e=e->urm;
        del->urm=e->urm;del_edge(x,e->info);euler(e->info,k+kaux);
    }}
}
int check()
{
  for(int i=1;i<=N;i++)
        if(grad[i]&1)
        return 0;
  return 1;
}
int main()
{
    int x,y;
    fin=fopen("ciclueuler.in","r");
    fout=fopen("ciclueuler.out","w");
    fscanf(fin,"%d %d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        v[i]=new nod;
        v[i]->info=i;
        v[i]->urm=0;
    }
    for(int i=1;i<=M;i++)
    {
        fscanf(fin,"%d %d",&x,&y);
        if(x==y)
            grad[x]++,ciclu[x]++;
        else
        {
            grad[x]++;
            grad[y]++;
            if(!v[x]->urm)
        {
            c=new nod;
            c->info=y;
            c->urm=0;
            v[x]->urm=c;
            e[x]=c;
        }
        else
        {
            c=new nod;
            c->info=y;
            c->urm=0;
            e[x]->urm=c;
            e[x]=c;
        }
            if(!v[y]->urm)
        {
            c=new nod;
            c->info=x;
            c->urm=0;
            v[y]->urm=c;
            e[y]=c;
        }
            else
        {
            c=new nod;
            c->info=x;
            c->urm=0;
            e[y]->urm=c;
            e[y]=c;
        }}
    }
    sol[1]=1;
    if(check())
    {euler(1,1);
    for(int i=1;i<M;i++)
        fprintf(fout,"%d ",sol[i]);
    fprintf(fout,"%d\n",sol[M]);}
    else
        fprintf(fout,"%d\n",1);
    return 0;
}