Pagini recente » Cod sursa (job #578915) | Cod sursa (job #1610104) | Cod sursa (job #1048388) | Cod sursa (job #1813416) | Cod sursa (job #2818709)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int INF = 1 << 30;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
class Graph {
private:
int _n, _m;
vector<vector<int>> _adjacentList; // liste de adiacenta
vector<vector<pair<int, int> >> _adjacentListMultigraph;
public:
Graph(int nodes, int edges) : _n(nodes), _m(edges) {}
void addEdgesMultigraph();
vector<int> ciclueuler(int start);
};
void Graph::addEdgesMultigraph() {
int x, y;
_adjacentListMultigraph.resize(_n + 1);
for (int i = 1; i <= _m; ++i) {
f >> x >> y;
_adjacentListMultigraph[x].push_back(make_pair(y, i));
_adjacentListMultigraph[y].push_back(make_pair(x, i));
}
}
vector<int> Graph::ciclueuler(int start) {
vector<int> answer;
vector<int> visitedEdges(_m + 1, 0);
for (int i = 0; i < _n; ++i)
if (_adjacentListMultigraph[i].size() % 2 != 0) {
answer.push_back(-1);
return answer;
}
stack<int> euler;
euler.push(start);
while (!euler.empty()) {
int currentNode = euler.top();
if (_adjacentListMultigraph[currentNode].size() != 0) {
int neighbour = _adjacentListMultigraph[currentNode].back().first;
int index = _adjacentListMultigraph[currentNode].back().second;
_adjacentListMultigraph[currentNode].pop_back();
if (visitedEdges[index] == 0) {
visitedEdges[index] = 1;
euler.push(neighbour);
}
} else {
euler.pop();
answer.push_back(currentNode);
}
}
return answer;
}
int main() {
int n, m;
f >> n >> m;
Graph gr(n, m);
gr.addEdgesMultigraph();
vector<int> answer = gr.ciclueuler(1);
for (int i = 0; i < answer.size() - 1; ++i) {
g << answer[i] << " ";
}
f.close();
g.close();
return 0;
}