Cod sursa(job #1133002)

Utilizator jonneJonne Jonnela jonne Data 4 martie 2014 11:21:00
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <string>
#include <list>
#include <set>
#include <fstream>

using namespace std;

#define N 100100
#define M 500500

int n, m;

struct node {
  multiset<int> con;
};

node nodes[N];

list<int> res;
typedef list<int>::iterator iter;

void add(int a, iter it) {
  int i = a;
  it++;
  do {
    int ni = *nodes[i].con.begin();
    nodes[ni].con.erase(nodes[ni].con.lower_bound(i)); // find(nodes[ni].con.begin(), nodes[ni].con.end(), i));
    nodes[i].con.erase(nodes[i].con.begin());
    //cout << i<<"->"<<ni << endl;
    res.insert(it, ni);
    i = ni;
  } while (i != a);
}

int main() {
  ifstream fin("ciclueuler.in");
  fin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    fin >> a >> b;
    nodes[a].con.insert(b);
    nodes[b].con.insert(a);
  }
  
  add(1, res.begin());
  iter start = res.begin();
  
  while (res.size() < m) {
    // Find new start
    while (nodes[*start].con.size() <= 0) {
      start++;
      if (start == res.end())
	start = res.begin();
    }
    //cout<<"UUSI\n";
    add(*start, start);
  }
  
  ofstream fout("ciclueuler.out");
  for (iter it = res.begin(); it != res.end(); ++it) {
    fout << *it << " ";
  }
}