Pagini recente » Cod sursa (job #678205) | Cod sursa (job #1063459) | Cod sursa (job #2065403) | Cod sursa (job #322226) | Cod sursa (job #2480387)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
const int NMax = 100000;
const int MMax = 500000;
vector <int> G[NMax+5], Sol;
stack <int> S;
struct Edges {int x, y;}V[MMax+5];
int N, M, Use[MMax+5], Viz[NMax+5];
void Read() {
in >> N >> M;
for(int i = 1, x, y; i <= M; i++) {
in >> x >> y;
G[x].push_back(i);
G[y].push_back(i);
V[i] = {x,y};
}
}
int Vec(int Nod, int m) {
if(Nod == V[m].x)
return V[m].y;
return V[m].x;
}
void DFS(int Nod) {
Viz[Nod] = 1;
for (auto m : G[Nod]) {
int Vecin = Vec(Nod,m);
if (!Viz[Vecin])
DFS(Vecin);
}
}
bool Check () {
DFS(1);
for (int i = 1; i <= N; i++)
if(!Viz[i] || G[i].size() % 2)
return 0;
return 1;
}
void Cycle(int Nod) {
while(G[Nod].size()) {
int m = G[Nod].back();G[Nod].pop_back();
if(!Use[m]) {
Use[m] = 1;
int Vecin = Vec(Nod,m);
cout << Nod << " " << Vecin << "\n";
S.push(Nod);
Nod = Vecin;
}
}
}
void Solve () {
int Nod = 1;
do {
Cycle(Nod);
Nod = S.top();S.pop();
Sol.push_back(Nod);
}
while(!S.empty());
}
void Print() {
for(auto i : Sol)
out << i << " ";
out << '\n';
}
int main() {
Read();
if(!Check()) {
out << -1 << '\n';
return 0;
}
Solve();
Print();
}