Pagini recente » Cod sursa (job #2801955) | Cod sursa (job #457181) | Cod sursa (job #1081663) | Cod sursa (job #94588) | Cod sursa (job #2927950)
#include <bits/stdc++.h>
using namespace std;
#define NO_NODES 100000
#define NO_EDGES 500000
struct Edge {
int x, y;
bool wasUsed;
int getNeighbour(int node) { return x == node ? y : x; }
};
int noNodes, noEdges;
Edge edges[NO_EDGES];
vector<int> graph[NO_NODES];
vector<int> cycle;
void addEdge(int edgeIndex, int x, int y) {
edges[edgeIndex] = {x, y};
graph[x].push_back(edgeIndex);
graph[y].push_back(edgeIndex);
}
bool checkDegrees() {
int node;
node = 0;
while (node < noNodes && graph[node].size() % 2 == 0)
++node;
return node == noNodes;
}
void euler(int node) {
int edgeIndex;
while (graph[node].size()) {
edgeIndex = graph[node].back();
graph[node].pop_back();
if (!edges[edgeIndex].wasUsed) {
edges[edgeIndex].wasUsed = true;
--noEdges;
euler(edges[edgeIndex].getNeighbour(node));
}
}
cycle.push_back(node);
}
int main() {
FILE* fin = fopen("ciclueuler.in", "r");
FILE* fout = fopen("ciclueuler.out", "w");
int x, y, i;
fscanf(fin, "%d%d", &noNodes, &noEdges);
for (i = 0; i < noEdges; ++i) {
fscanf(fin, "%d%d", &x, &y);
addEdge(i, x - 1, y - 1);
}
if (checkDegrees()) {
euler(0);
if (noEdges == 0) {
cycle.pop_back();
for (int node : cycle)
fprintf(fout, "%d ", node + 1);
} else
fprintf(fout, "-1\n");
} else
fprintf(fout, "-1\n");
fclose(fin);
fclose(fout);
return 0;
}