Cod sursa(job #1702218)

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

using namespace std;

FILE *fin;
int p=LIM-1;
char str[LIM];

inline void avans(){
  if(++p==LIM){
    fread(str, 1, LIM, fin);
    p=0;
  }
}

inline int getnr(){
  int nr=0;
  while(isdigit(str[p])==0)
    avans();
  while(isdigit(str[p])){
    nr=nr*10+str[p]-'0';
    avans();
  }
  return nr;
}

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 *fout;
    int n, m, i, x, y;
    fin=fopen("ciclueuler.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for(i=0; i<m; i++){
      x=getnr(); y=getnr();
      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;
}