Pagini recente » Cod sursa (job #3361927) | Cod sursa (job #3361177) | Cod sursa (job #3361926) | Cod sursa (job #3361174) | Cod sursa (job #3362275)
#include <bits/stdc++.h>
#define MAXN 100000
#define MAXM 500000
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector <pair<int, int>> graf[MAXN + 1];
int grad[MAXN + 1], viz[MAXM + 1], sef[MAXN + 1], sz[MAXN + 1];
int find_sef(int i){
if(sef[i] == i){
return i;
}
return sef[i] = find_sef(sef[i]);
}
void union_sef(int a, int b){
int sef_a, sef_b, ax;
sef_a = find_sef(a);
sef_b = find_sef(b);
if(sz[sef_a] < sz[sef_b]){
ax = sef_a;
sef_a = sef_b;
sef_b = ax;
}
sz[sef_a] += sz[sef_b];
sef[sef_b] = sef_a;
}
void euler(int nod){
int i;
for(i = 0; i < graf[nod].size(); i++){
if(viz[graf[nod][i].second] == 0){
viz[graf[nod][i].second] = 1;
euler(graf[nod][i].first);
}
}
fout << nod << " ";
}
int main()
{
int n, m, i, a, b, cnt;
fin >> n >> m;
for(i = 1; i <= n; i++){
sef[i] = i;
sz[i] = 1;
}
cnt = n;
for(i = 1; i <= m; i++){
fin >> a >> b;
if(find_sef(a) != find_sef(b)){
cnt--;
union_sef(a, b);
}
grad[a]++;
grad[b]++;
graf[a].push_back({b, i});
graf[b].push_back({a, i});
}
i = 1;
while(i <= n && grad[i] % 2 == 0){
i++;
}
if(i <= n || cnt > 1){
fout << "-1\n";
}else{
euler(1);
fout << "\n";
}
return 0;
}