Cod sursa(job #1702212)

Utilizator cella.florescuCella Florescu cella.florescu Data 14 mai 2016 19:13:05
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <list>
#include <queue>
#define MAXN 100010
#define MAXM 500010

using namespace std;

int sol[MAXM+1], s;
list <int> lst[MAXN+1];
int viz[MAXN+1], grad[MAXN+1], stiv[MAXM+1];

void bfs(int nod){
  viz[nod]=1;
  queue <int> q;
  q.push(nod);
  while(q.empty()==0){
    nod=q.front();
    viz[nod]=1;
    q.pop();
    for(list <int>::iterator it=lst[nod].begin(); it!=lst[nod].end(); it++)
      if(viz[*it]==0)
        q.push(*it);
  }
}

void euler(int nod){
  int st=0;
  list <int>::iterator it;
  stiv[st]=nod;
  while(st>=0)
    if(lst[stiv[st]].empty())
      sol[s++]=stiv[st--];
    else{
      nod=lst[stiv[st]].front();
      lst[stiv[st]].pop_front();
      for(it=lst[nod].begin(); *it!=stiv[st]; it++);
      lst[nod].erase(it);
      stiv[++st]=nod;
    }
}

int main()
{
    FILE *fin, *fout;
    int n, m, i, x, y;
    fin=fopen("ciclueuler.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for(i=0; i<m; i++){
      fscanf(fin, "%d%d", &x, &y);
      grad[x]++; grad[y]++;
      lst[x].push_back(y);
      lst[y].push_back(x);
    }
    fclose(fin);
    bfs(1);
    for(i=1, x=0; i<=n && x==0; i++)
      if((grad[i]&1) || viz[i]==0)
        x=1;
    fout=fopen("ciclueuler.out", "w");
    if(x)
      fprintf(fout, "-1\n");
    else{
      euler(1);
      for(i=0; i<s-1; i++)
        fprintf(fout, "%d ", sol[i]);
      fprintf(fout, "\n");
    }
    return 0;
}