Cod sursa(job #1976617)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 3 mai 2017 21:24:59
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;
ifstream in("ciclueuler.in");  //n (100000)  m (200000), m perechi muchiile
ofstream out("ciclueuler.out");

int const nmax = 1000000;

//1 -> (1, 2), (1, 3), (1, 4)

struct Edge{
  int x;
  int y;
  bool del;
};

vector <Edge> edge;
vector <vector<int>> v; //v[i] = muchiile care pleaca din nodul i

int frec[1 + nmax];
int cc[1 + nmax]; //cc[i] = componenta conexa caruia nodul i apartine

//pentru determinarea conexitatii grafului
void dfs(int nod) {
  cc[nod] = 1;
  for(int i = 0 ; i < v[nod].size(); i++) {
    int x = edge[v[nod][i]].x;
    int y = edge[v[nod][i]].y;

/*
    if(x == nod && cc[y] == 0)
      dfs(y);
    else if(y == nod && cc[x] == 0)
      dfs(x);
*/
    if(cc[y] == 0)
      dfs(y);
    else if(cc[x] == 0)
      dfs(x);
  }
}

stack<int> st;
//varianta iterativa a buildercircuit
void buildeulercircuit2(int nod) {
  st.push(nod);

  while(0 < st.size()) {
    if(0 < v[st.top()].size()) {
      int e = v[st.top()].back();
      //atentie cand folosesti back, sau top sau orice altceva care interogheaza o structura de date
      //verifica de o mie de ori ca structura de date nu e goala
      v[st.top()].pop_back();
      if(edge[e].del == 0) {
        edge[e].del = 1;
        int x = edge[e].x;
        int y = edge[e].y;
        if(x == st.top()) {
          st.push(y);
        } else{
          st.push(x);
        }
      }
    } else{
      out<<st.top()<<" ";
      st.pop();
    }
  }
}

void buildeulercircuit(int nod) {
  while(0 < v[nod].size()) {
    int e = v[nod].back(); //v[nod][v[nod].size() - 1];
    v[nod].pop_back();
    if(edge[e].del == 0) {
      edge[e].del = 1;
      int x = edge[e].x;
      int y = edge[e].y;
      if(x == nod) {
        buildeulercircuit(y);
      } else{
        buildeulercircuit(x);
      }
    }
  }
  out<<nod<<" ";
}

int main() {
  int n ,m;
  in>>n>>m;
  for(int i = 0 ; i <= n ;i++){
    vector <int> temp;
    v.push_back(temp);
  }
  int neizo = 0;
  for(int i = 0 ; i < m ;i++) {
    int x ,y;
    in>>x>>y;
    edge.push_back({x ,y ,0});
    v[x].push_back(i);
    v[y].push_back(i);
    frec[x]++;
    frec[y]++;
    neizo = x;
  }
  dfs(neizo);
  bool flag = 1;
  int first = 0;
  for(int i = 1 ; i <= n ;i++) {
    //cout<<frec[i]<<" "<<cc[i]<<'\n';

    if((frec[i] & 1) == 1)
      flag = 0;
    if(cc[i] == 0 && 0 < frec[i])
      flag = 0;
  }
  out<<flag<<'\n';
  if(flag == 1)
    buildeulercircuit2(neizo);
  return 0;
}