Cod sursa(job #688247)

Utilizator rusu_raduRusu Radu rusu_radu Data 23 februarie 2012 12:36:38
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <cstdio>
#include <cassert>
#include <vector>
#define Nmax 100005
#define InFile "ciclueuler.in"
#define OutFile "ciclueuler.out"
#define pb push_back

using namespace std;

int n, m, mc;
int gr[Nmax];
vector <int> A[Nmax];
struct Nod {int vf; Nod *next, *prev;} *st, *fsh, *pr, *ult;

void read();
int check();
void solve();
void want_a_cicle(int);
void kill(int,int);
void write();

int main()
{
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  read();
  if (!check())
  {
    printf ("-1\n");
    return 0;
  }
  solve();
  write();
  return 0;
}

void read()
{
  int i, x, y;
  scanf ("%d %d\n", &n, &m);
  for (i=1; i<=m; i++)
  {
    scanf ("%d %d\n", &x, &y);
    A[x].pb (y); gr[x]++;
    A[y].pb (x); gr[y]++;
  }
}

int check()
{
  int i;
  for (i=1; i<=n; i++)
    if (gr[i]%2==1 || gr[i]==0)
      return 0;
  return 1;
}

void solve()
{
  Nod *it;
  //Ciclu MARE
  st=new Nod;
  fsh=new Nod;
  st->next=fsh; st->prev=NULL;
  fsh->prev=st; fsh->next=NULL;
  
  //Ciclu MIC
  pr=new Nod; ult=new Nod;
  pr->vf=0; ult->vf=0;
  want_a_cicle(1);
  st->next=pr->next;
  pr->next->prev=st;
  fsh->prev=ult->prev;
  ult->prev->next=fsh;
  while (mc<m)
  {
    for (it=st->next; it!=fsh; it=it->next)
      if (gr[it->vf])
      {
        want_a_cicle (it->vf);
        break;
      }
    it->prev->next=pr->next;
    pr->next->prev=it->prev;
    
    ult->prev->next=it;
    it->prev=ult->prev;
  }
}

void want_a_cicle(int nd)
{
  int i, x, y, lg;
  Nod *el;
  lg=A[nd].size();
  pr->next=ult; pr->prev=NULL;
  ult->prev=pr; ult->next=NULL;
  x=nd;
  do
  {
    el=new Nod;
    el->vf=x;
    el->next=ult;
    ult->prev->next=el;
    el->prev=ult->prev;
    ult->prev=el;
    lg=A[x].size();
    for (i=0; i<lg; i++)
    {
      if (A[x][i])
      {
        y=A[x][i];
        A[x][i]=0;
        kill (y, x);
        gr[x]--;
        gr[y]--;
        x=y;
        mc++;
        break;
      }
    }
  }
  while (x!=nd);
}

void kill (int nd, int x)
{
  int i, lg=A[nd].size();
  for (i=0; i<lg; i++)
    if (A[nd][i]==x)
    {
      A[nd][i]=0;
      break;
    }
}

void write()
{
  Nod *it;
  for (it=st->next; it!=fsh; it=it->next)
    printf ("%d ", it->vf);
  printf ("\n");
}