Pagini recente » Cod sursa (job #688425) | Cod sursa (job #3223213) | Cod sursa (job #7684) | Cod sursa (job #2426894) | Cod sursa (job #2139047)
// Ciclu eulerian - O(N+M) - RECURSIV
#include <fstream>
#include <bitset>
#include <vector>
#define Nmax 100009
#define Mmax 500009
#define pb push_back
#define x first
#define y second
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
typedef pair<int,int> PP;
int N, M;
vector<int> G[Nmax]; /* matricea de adiacenta */
vector<int> Cycle; /* ciclul eulerian */
PP E[Mmax]; /* E[i] = (x, y) este muchia cu nr i */
bitset < Mmax > viz; /* viz[i] = 1 <=> am trecut deja pe muchia i */
void ReadInput() {
fin >> N >> M;
for (int i = 1; i <= M; i++) {
int x, y;
fin >> x >> y;
E[i]=PP(x, y);
G[x].pb(i);
G[y].pb(i);
}
}
inline bool AdmiteCiclu() {
// sa aiba toate nodurile cu grad par
for (int i = 1; i <= N; i++) {
if (G[i].size()&1) {
return 0;
}
}
return 1;
}
inline void DFS(int node) {
for (auto i : G[node]) {
if (!viz[i]) {
viz[i] = 1;
DFS(E[i].x + E[i].y - node); // Trec in celalalt capat al muchiei
}
}
Cycle.pb(node);
}
int main() {
ReadInput();
if (AdmiteCiclu()) {
DFS(1); // fac ciclul
//afisez
for (auto &node : Cycle) {
fout << node << ' ';
}
fout << '\n';
} else {
fout << -1 << '\n';
}
fin.close();
fout.close();
return 0;
}