Pagini recente » Cod sursa (job #2899037) | Cod sursa (job #1112375) | Cod sursa (job #3147243) | Cod sursa (job #500823) | Cod sursa (job #2509358)
#include <cstdio>
#include <vector>
#include <stack>
#define MMAX 500005
#define NMAX 100005
using namespace std;
struct muchie{
int x, y;
bool vizmuchie=false;
};
muchie muchii[MMAX];
int n, m, nrizolat=0, nr;
int x, y, d[NMAX];
int viz_conex[NMAX];
stack<int> ciclu;
vector<int> graph[NMAX];
int verif_grad(){
int ok=1;
for(int i=1; i<=n; i++){
if(d[i]%2 != 0 || (viz_conex[i]==0 && d[i]!=0))
return 0;
}
return 1;
}
void euler(){ // graph[nod]
ciclu.push(1);
while(!ciclu.empty()){
int x = ciclu.top(); // ultimul nod
if(!graph[x].empty()){
int ultim = graph[x].back(); // indicele ultimei muchii
graph[x].pop_back();
if(muchii[ultim].vizmuchie == false){
int nod = (x==muchii[ultim].x)?muchii[ultim].y:muchii[ultim].x;
ciclu.push(nod);
muchii[ultim].vizmuchie = true;
}
}
else {
if(ciclu.size()>1)
printf("%d ", x);
ciclu.pop();
}
}
}
void parcurgere(int i){
viz_conex[i] = 1;
for(auto &v:graph[i]){
int x = (i==muchii[v].x)?muchii[v].y:muchii[v].x;
if(viz_conex[x] == 0){
parcurgere(x);
}
}
}
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i=1; i<=m; i++){
scanf("%d %d", &muchii[i].x, &muchii[i].y);
graph[muchii[i].x].push_back(i);
graph[muchii[i].y].push_back(i);
d[x]++;
d[y]++;
}
parcurgere(1);
if(verif_grad() == 1){
euler();
}
else printf("-1");
return 0;
}