Cod sursa(job #315997)

Utilizator mlazariLazari Mihai mlazari Data 17 mai 2009 22:35:44
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<stdio.h>
#define NMAX 100003
#define MMAX 500003

struct lista {
  int x;
  lista *next;
};

lista *v[NMAX],*s=NULL;
int viz[NMAX],g[NMAX],cic[MMAX],nc=0,ncic=0,n,m;

void adauga(lista* &l,int x) {
  lista *q=new lista;
  q->x=x;
  q->next=l;
  l=q;
}

void pop(lista* &l,int &x) {
  lista *q=l;
  x=q->x;
  l=l->next;
  delete q;
}

void sterge(int x,int y) {
  lista *q=v[x],*pq=NULL;
  while(q) {
    if(q->x==y) {
      if(pq) pq->next=q->next;
      else v[x]=q->next;
      delete q;
      return;
    }
    pq=q;
    q=q->next;
  }
}

void citeste() {
  int i,x,y;
  freopen("ciclueuler.in","r",stdin);
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++) {
    v[i]=NULL;
    viz[i]=0;
    g[i]=0;
  }
  for(i=0;i<m;i++) {
    scanf("%d %d",&x,&y);
    adauga(v[x],y);
    adauga(v[y],x);
    g[x]++;
    g[y]++;
  }
  fclose(stdin);
}

void dfs(int nod) {
  nc++;
  viz[nod]=1;
  lista *q=v[nod];
  while(q) {
    if(!viz[q->x]) dfs(q->x);
    q=q->next;
  }
}

int conex() {
  dfs(1);
  return nc<n?0:1;
}

int eulerian() {
  if(conex()) {
    for(int i=1;i<=n;i++)
     if(g[i]%2==1) return 0;
    return 1;
  }
  return 0;
}

void euler() {
  int nod=1,x;
  do {
    if(v[nod]) {
      pop(v[nod],x);
      sterge(x,nod);
      adauga(s,nod);
      nod=x;
    }
    else {
      cic[ncic++]=nod;
      pop(s,nod);
    }
  } while(s);
}

void scrie() {
  freopen("ciclueuler.out","w",stdout);
  if(eulerian()) {
    euler();
    while(ncic-->0) printf("%d ",cic[ncic]);
  }
  else printf("%d",-1);
  fclose(stdout);
}

int main() {
  citeste();
  scrie();
  return 0;
}