Cod sursa(job #1274662)

Utilizator juniorOvidiu Rosca junior Data 24 noiembrie 2014 05:47:52
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");
int n, ni, ms, m, nc, nu, pni, i, nec, g[2000], p;
short a[2000][2000], c[10000], cnou[10000];

void inserare (int p, int l) { // p - pozitia incepand de la care se insereaza
  for (i = nec; i >= p; i--)
    c[i+l] = c[i];
  for (i = 1; i <= l; i++) // l - lungimea noului ciclu
    c[i+p-1] = cnou[i];
  nec += l; // sa verificam ce se intampla daca nu facem operatia!
}
/*         3 4
c    : 1 2 6             1
cnou :       3       4 6
cnou :         5 7 3
*/
/*
 i     x
----------
 1     p
 2    p+1  ==> x-i = p-1 ==> x = p-1+i
 3    p+2
 */
void citire () {
  int l, c, i;

  fin >> n >> m;
  for (i = 1; i <= m; i++) {
    fin >> l >> c;
    a[l][c]++; a[c][l]++; g[l]++; g[c]++;
  }
}

int vecin (int nc) {
  int v;

  for (v = 1; a[nc][v] == 0; v++); // Cat timp nu este vecin, il marim pe v.
  return v;
}
int main () {
  citire();
  ni = 1; // nodul initial
  while (ms < m) {// cat timp nu s-au selectat toate muchiile
    i = 0; nc = ni;
    do {                                  // Determinam un ciclu mic.
      nu = vecin (nc);                    // nodul urmator
      g[nu]--; g[nc]--;                   // scad gradele pt ca muchia nu mai exista
      a[nu][nc]--; a[nc][nu]--;           // consumam muchia [nc,nu]
      ms++;                               // Selectam inca o muchie.
      nc = nu;                            // nodul curent pentru pasul urmator
      cnou[++i] = nc;                     // punem inca un nod in ciclul curent
    } while (nc != ni);
    if (c[1] != 0)                        // Am determinat cel putin un ciclu.
      for (pni = 1; c[pni] != ni; pni++); // de vazut cu watches!
    inserare (pni + 1, i);
    if (ms < m)
      for (i = 1; g[c[i]] == 0; i++);
    ni = c[i];
  }
  for (i = 1; i <= m; i++)                // Afisare
    fout << c[i] << ' ';
  return 0;
}