Pagini recente » Cod sursa (job #1479552) | Cod sursa (job #3212424) | Cod sursa (job #2137898) | Cod sursa (job #405112) | Cod sursa (job #1199153)
#include <cstdio>
#include <list>
#include <vector>
using namespace std;
#define MAX 100001
struct muc{
int x, y;
bool ok;
} v[5*MAX];
int n, m;
bool vizitat[MAX];
vector <int> lista[MAX];
list <int> cic;
int euler();
int ciclu(list <int>::iterator it);
int main()
{
int i, a ,b, ok;
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i=1; i<=m; i++){
scanf("%d%d", &a, &b);
v[i].x = a; v[i].y = b;
lista[a].push_back(i);lista[b].push_back(i);
}
euler();
ok = 1;
for(i=2; i<=n; i++)
if(!vizitat[i]) {ok = 0;}
for(i=1; i<=m; i++)
if(!v[i].ok) {ok = 0;}
if(ok==0)
printf("-1\n");
else{
cic.pop_back();
for(list<int>::iterator it=cic.begin(); it!=cic.end(); it++)
printf("%d ", *it);
}
return 0;
}
int euler(){
int cod;
list<int>::iterator it;
cic.push_back(1);
it = cic.begin();
do{
cod = ciclu(it);
if(cod==0) return 0;
if(cod==2) it--;
}while(it!=cic.begin());
}
int ciclu(list <int>::iterator it){
int a, b, nod, start;
nod = start = *it;
while(!lista[nod].empty() and v[lista[nod].back()].ok) lista[nod].pop_back();
if(lista[start].empty()) return 2; //ciclu vid
do{
while(!lista[nod].empty() and v[lista[nod].back()].ok)
lista[nod].pop_back();
if(lista[nod].empty()) return 0;
else{
a = v[lista[nod].back()].x;
b = v[lista[nod].back()].y;
v[lista[nod].back()].ok = true;
if(nod==a) nod = b;
else nod = a;
vizitat[nod] = true;
it = cic.insert(it, nod);
}
}while(nod!=start);
return 1;
}