Cod sursa(job #1922819)

Utilizator Mstar_AngelComan Mara Stefania Mstar_Angel Data 10 martie 2017 19:02:25
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<stdio.h>
#include<vector>
#include<stack>
//#include<algorithm>
#define N 100001
#define M 500001
using namespace std;
FILE *in, *out;
struct Graf{
  int node, poz;
};
vector <Graf> v[N];
stack <int> stiv;
bool grad[N];
bool viz[M];

void euler (){
  int nod, son;
  stiv.push (1);
  while (stiv.empty () == 0){
    nod = stiv.top();
    while (v[nod].empty() == 0 && viz[v[nod].back().poz] == true)
      v[nod].pop_back();
    if (v[nod].empty() == 0){
      son = v[nod].back().node;
      stiv.push(son);
      viz[v[nod].back().poz] = true;// muchie viz
      v[nod].pop_back();//scot fiul
    }
    else {
      if (stiv.size() > 1)
        fprintf (out,"%d ",  nod);
      stiv.pop();
    }
  }
}

int main (){
  in = fopen ("ciclueuler.in","r");
  out = fopen ("ciclueuler.out","w");
  int n,m,i,n1,n2,pp;
  fscanf (in,"%d%d",&n,&m);
  for (i=1;i<=m;i++){
    fscanf(in,"%d%d",&n1,&n2);
    v[n1].push_back({n2,i});
    v[n2].push_back({n1,i});
    grad[n1] = !grad[n1]; grad[n2] = !grad[n2];
  }

  pp = 0;
  for (i=1;i<=n && pp == 0;i++)
    if (grad[i] == 1)
      pp = 1;

  if (pp == 1)
    fprintf (out,"-1");
  else
    euler ();

  fclose (in);
  fclose (out);
  return 0;
}