Cod sursa(job #1700909)

Utilizator cella.florescuCella Florescu cella.florescu Data 11 mai 2016 18:38:07
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <list>
#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];

void dfs(int nod){
  viz[nod]=1;
  for(list <int>::iterator it=lst[nod].begin(); it!=lst[nod].end(); it++)
    if(viz[*it]==0)
      dfs(*it);
}

void euler(int nod){
  int node;
  list <int>::iterator it;
  while(lst[nod].empty()==0){
    node=lst[nod].front();
    lst[nod].pop_front();
    for(it=lst[node].begin(); *it!=nod; it++);
    lst[node].erase(it);
    euler(node);
  }
  sol[s++]=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);
    dfs(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;
}