Cod sursa(job #1893854)

Utilizator oanaroscaOana Rosca oanarosca Data 26 februarie 2017 08:42:03
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>

using namespace std;

struct muchie {
  int x, y;
};

vector<int>mv[100001], st; // muchii vecine
muchie m[500001]; // capetele muchiilor
int noduri, muchii, x, y;
bool viz[500001];

int main () {
  ifstream fi("ciclueuler.in");
  ofstream fo("ciclueuler.out");
  fi >> noduri >> muchii;
  for (int i = 1; i <= muchii; i++) {
    fi >> x >> y;
    mv[x].push_back(i);
    mv[y].push_back(i);
    m[i].x = x, m[i].y = y;
  }
  for (int i = 1; i <= noduri; i++)
    if (mv[i].size() & 1) {
      fo << -1; return 0;
    }
  st.push_back(1);
  while (!st.empty()) {
    int nc = st.back(); // nod curent
    if (!mv[nc].size()) // am vizitat toate muchiile nodului curent
      fo << nc << ' ', st.pop_back();
    else {
      int mc = mv[nc].back(); // muchie curenta
      mv[nc].pop_back();
      if (!viz[mc]) {
        viz[mc] = 1;
        // adaugam nodul vecin in stiva
        if (m[mc].x == nc)
          st.push_back(m[mc].y);
        else
          st.push_back(m[mc].x);
      }
    }
  }
  return 0;
}