Pagini recente » Cod sursa (job #1711294) | Cod sursa (job #2938428) | Cod sursa (job #813936) | Cod sursa (job #2433684) | Cod sursa (job #2128345)
#include <iostream>
#include <fstream>
#include <cstring>
#define NMAX 1000500
#define MMAX 2000000
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
struct elem{
int val;
elem *urm;
}*v[NMAX];
int gradNod[NMAX];
int cicluEuler[NMAX],lg;
int n, m;
void citire(){
in >> n >> m;
for(int i = 1; i <= m; i++){
int x, y;
in >> x >> y;
gradNod[x]++;
gradNod[y]++;
elem * deAdaugat = new elem;
deAdaugat -> val = y;
deAdaugat -> urm = v[x];
v[x] = deAdaugat;
if(x != y){
elem * deAdaugat2 = new elem;
deAdaugat2 -> val = x;
deAdaugat2 -> urm = v[y];
v[y] = deAdaugat2;
}
}
}
bool validareGrafEulerian(){
for(int i = 1; i <= n; i++){
if( gradNod[i]%2 == 1){
return false;
}
}
return true;
};
void stergereMuchie(int a, int b){
elem * parcurg = v[a];
if(parcurg -> val == b){
parcurg = parcurg -> urm;
v[a] = parcurg;
return;
}
while(parcurg -> urm != NULL){
if(parcurg -> urm -> val == b){
parcurg -> urm = parcurg -> urm -> urm;
break;
}else{
parcurg = parcurg -> urm;
}
}
}
void generareCiclu(){
int stiva[MMAX], vfStiva;
vfStiva = 1;
stiva[1] = 1;
while(vfStiva != 0){
int elemVarf = stiva[vfStiva];
elem *parcurg = v[elemVarf];
bool ok = false;
if(parcurg != NULL){
stiva[++vfStiva] = parcurg -> val;
stergereMuchie(elemVarf, parcurg -> val);
if(parcurg -> val != elemVarf){
stergereMuchie(parcurg -> val, elemVarf);
}
ok = true;
}
if(ok == false){
cicluEuler[++lg] = elemVarf;
vfStiva--;
}
}
}
void afisare(){
for(int i = 1; i < lg; i++){
out << cicluEuler[i] << ' ';
}
}
int main() {
citire();
if(validareGrafEulerian() == false){
out << "-1";
}
generareCiclu();
afisare();
return 0;
}