Pagini recente » Istoria paginii utilizator/mrsteffe | Statistici Danila Sebastian (SebiD) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1821568)
#include <cstdio>
#include <algorithm>
#include <bitset>
using namespace std;
const int MAX_N = 100000;
const int MAX_M = 500000;
bool viz[1 + MAX_N];
class Muchie {
public:
int u;
int v;
bool viz;
Muchie(int _u = 0, int _v = 0, bool _viz = false):
u(_u), v(_v), viz(_viz) { }
inline int vecin(int nod) {
return u + v - nod;
}
};
vector<Muchie*> muchii[1 + MAX_N];
inline void dfs(int nod, int& dim) {
if(!viz[nod]) {
viz[nod] = true;
++ dim;
for(auto *it: muchii[nod])
dfs(it->vecin(nod), dim);
}
}
int st[1 + MAX_M], top;
int main() {
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
for(int i = 0; i < M; i++) {
int u, v;
scanf("%d %d", &u, &v);
Muchie* m = new Muchie(u, v);
muchii[u].push_back(m);
muchii[v].push_back(m);
}
for(int i = 1; i <= N; ++ i) {
if(muchii[i].size() & 1) {
puts("-1");
return 0;
}
}
int cc = 0, root;
for(int i = 1; i <= N; ++ i) {
if(!viz[i]) {
int dim = 0;
dfs(i, dim);
if(dim > 1) {
++ cc;
root = i;
}
}
}
if(cc == 1) {
st[++ top] = root;
while(top > 0) {
int nod = st[top];
bool izolat = true;
for(Muchie *m : muchii[nod]) {
int vecin = m->vecin(nod);
if(m->viz == false) {
izolat = false;
m->viz = true;
st[++ top] = vecin;
break;
}
}
if(izolat) {
if(top > 1)
printf("%d ", nod);
-- top;
}
}
} else
puts("-1");
return 0;
}