Cod sursa(job #1831736)

Utilizator Valentin0709Datcu George Valentin Valentin0709 Data 18 decembrie 2016 17:20:32
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include<stdio.h>
using namespace std;

FILE*f=fopen("ciclueuler.in","r");
FILE*g=fopen("ciclueuler.out","w");

struct nod {
    int inf;
    nod *urm;
} *v[100005];

int nrm,n,m,x,y,i,viz[100005],q[500005];

void adaug(nod *&a, int x) {
    nod *p=new nod;
    p->inf=x; p->urm=a;
    a=p;
}

int grad(int x) {
    int k=0;
    nod *i;
    for(i=v[x];i!=NULL;i=i->urm)
        if(i->inf!=x) k++;
    return k;
}

void df(int x) {
    nod *j;
    viz[x]=1;
    for(j=v[x];j!=NULL;j=j->urm)
        if(viz[j->inf]==0&&j->inf!=-1) df(j->inf);
}

int conex() {
    int i;
    for(i=1;i<=n;i++) viz[i]=0;
    df(1);
    for(i=1;i<=n;i++)
        if(viz[i]==0&&grad(i)!=0) return 0;
    return 1;
}

int gradpar() {
    int i;
    for(i=1;i<=n;i++)
        if(grad(i)%2==1) return 0;
    return 1;
}

void sterg(nod *&p,int j) {
    nod *k,*a;
    if(j==p->inf) {
        a=p;
        p=p->urm;
        delete a;
    }
    else {
        for(k=p;k!=NULL&&k->urm->inf!=j;k=k->urm) {}
        a=k->urm;
        k->urm=k->urm->urm;
        delete a;
    }
}

void afis(int i) {
    int z;
    nod *j;
    q[++nrm]=i;
    if(nrm!=m)
    for(j=v[i];j!=NULL;j++) {
        z=j->inf;
        if(z!=i) {
            sterg(v[i],z);
            sterg(v[z],i);
        }
        else sterg(v[i],z);
        if(conex()) {
            afis(z);
            break;
        }
        else
           if(z!=i) {
            adaug(v[i],z);
            adaug(v[z],i);
           }
           else adaug(v[i],z);

    }
}

int main() {
    fscanf(f,"%d%d",&n,&m);

    for(i=1;i<=m;i++) {
        fscanf(f,"%d%d",&x,&y);
        if(x!=y) {
            adaug(v[x],y);
            adaug(v[y],x);
        }
        else adaug(v[x],y);
    }

   if(conex()&&gradpar()) {
        afis(1);
        for(i=1;i<=m;i++) fprintf(g,"%d ",q[i]);
    }
    else fprintf(g,"-1");

    return 0;
}