Cod sursa(job #1908070)

Utilizator stefan_bogdanstefan bogdan stefan_bogdan Data 6 martie 2017 22:34:55
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <stdio.h>
#include <vector>

#define MAXN 100003
#define MAXM 500003

#define inFile "ciclueuler.in"
#define outFile "ciclueuler.out"

using namespace std;

int n, m;
bool used[MAXM];
vector<unsigned int> G[MAXN];
vector<unsigned int> st;
vector<unsigned int> sol;
unsigned int A[MAXN], B[MAXN];

void read(void)
{
  FILE * f = fopen(inFile, "r");
  fscanf(f, "%d %d", &n, &m);
  for (int i = 1, x, y; i <= m; i++)
  {
    fscanf(f, "%d %d", &x, &y);
    G[x].push_back(i);
    G[y].push_back(i);
    A[i] = x;
    B[i] = y;
  }
  fclose(f);
}

void euler(int nod)
{
  for (vector<unsigned int>::iterator i = G[nod].begin(); i != G[nod].end(); i++)
  {
    if (!used[*i])
    {
      used[*i] = 1;
      if (A[*i] == nod) euler(B[*i]); else euler(A[*i]);
    }
  }
  cout << nod << " ";
}

void dfs(int nod)
{
  st.push_back(nod);
  while (!st.empty())
  {
    int nod = st.back();
    if (!G[nod].empty())
    {
      int muchie = G[nod].back(); G[nod].pop_back();
      if (!used[muchie])
      {
        used[muchie] = 1;
        if (A[muchie] == nod)
          st.push_back(B[muchie]);
        else
          st.push_back(A[muchie]);
      }
    }
    else
    {
      st.pop_back();
      sol.push_back(nod);
    }
  }
}

bool IsOkay()
{
  for (int i = 1; i <= n; i++)
    if (G[i].size() % 2)
      return false;
  return true;
}

void write()
{
  FILE * g = fopen(outFile, "w");
  if (!IsOkay())
  {
    fprintf(g, "-1");
  }
  else
  {
    sol.pop_back();
    for (vector<unsigned int>::iterator i = sol.begin(); i != sol.end(); i++)
      fprintf(g, "%d ", *i);
  }
  fclose(g);
}

int main()
{
  read();
  dfs(1);
  write();

  return 0;
}