Pagini recente » Cod sursa (job #549137) | Cod sursa (job #2729547) | Cod sursa (job #2158160) | Cod sursa (job #2466318) | Cod sursa (job #2435086)
#pragma once
#include<iostream>
#include<vector>
#include<fstream>
#include<queue>
#include<algorithm>
#include<unordered_map>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int V, E;
class Node {
public:
unordered_map<int, int> adj; // map pentru ca va trebui sa stergem muchii si se admit bucle si muchii paralele
void add(int id) {
adj[id]++;
}
};
vector<Node> nodes;
vector<int> deg;
int checkEulerian() {
for (int i = 1; i < deg.size(); i++) {
if (deg[i] % 2 != 0)
return 0;
}
return 1;
}
void rec(int c) {
int id;
for (auto x : nodes[c].adj) {
if (x.second) {
// delete edge, update degs and recurr
id = x.first;
nodes[c].adj[id] --;
deg[c]--;
deg[id]--;
if (id != c) {
nodes[id].adj[c]--;
}
rec(x.first); // this takes the first edge and goes automatically
}
}
// no more edges
fout << c << " ";
}
void Hierholzer() {
rec(1);
}
int main() {
int x, y, w;
fin >> V >> E;
nodes.resize(V+1);
deg.resize(V + 1, 0);
for (int i = 0; i < E; i++) {
fin >> x >> y;
nodes[x].add(y);
if (x != y)
nodes[y].add(x);
deg[x]++;
deg[y]++;
}
if (checkEulerian()) {
Hierholzer();
}
else
fout << -1;
return 0;
}