Pagini recente » Cod sursa (job #2091706) | Cod sursa (job #1604211) | Cod sursa (job #1158978) | Cod sursa (job #2934275) | Cod sursa (job #1274662)
#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;
}