Pagini recente » Cod sursa (job #748180) | Cod sursa (job #1169775) | Cod sursa (job #2653057) | Cod sursa (job #588920) | Cod sursa (job #1006423)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
#define Mmax 500001
using namespace std;
stack <int> c; //stiva cu noduri
int ce[Mmax]; //solutia
vector<int> a[100001]; //muchiile
int k;
void ciclu(int nr){
int x = nr, z; //salvam nodul de start
do
if(a[x].size()){ //daca nodul are vecin
c.push(a[x][0]); //adaugam nodul in stiva pentru (incercam sa formam un nou ciclu din el)
z = a[x][0];
a[z].erase(find(a[z].begin(), a[z].end(), x)); //stergem muchia de la z la x
a[x].erase(a[x].begin()); //stergem muchia de la x la z
x = z; //ne mutam in nodul z
}
while (x!=nr); //cat timp nu am ajuns in nodul de inceput (!ciclu)
}
int main(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
int N, M;
scanf("%d%d",&N,&M);
for (int i = 1; i <= M; i++){
int x, y;
scanf("%d%d",&x,&y);
a[x].push_back(y);
a[y].push_back(x); //graf neorientat
}
for (int i = 1; i <= N; i++)
if (a[i].size() % 2){ //daca un nod are gr impar
printf("-1"); //nu este eulerian
return 0;
}
c.push(1);
do {
if (a[c.top()].size() > 0) //daca nodul curent are muchii nefolosite
ciclu(c.top()); //putem forma un nou ciclu
ce[++k]=c.top(); //adaugam nodul curent la sol, trecem la nod anterior
c.pop();
}
while (c.size() != 1);
if(k != M){ //daca nu am folosit toate muchiile
printf("-1"); return 0; //nu este eulerian
}
for (int i = 1; i <= k; i++) //afisam nodurile din ciclu
printf("%d ",ce[i]);
return 0;
}