Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Diferente pentru problema/tictac intre reviziile 3 si 2 | Cod sursa (job #2626332) | Cod sursa (job #2092395)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");
const int MAX_N = 100000;
const int MAX_M = 500000;
struct Edge {
int u;
int v;
bool visited;
int other(int vertex) {
return u + v - vertex;
}
};
int n, m;
Edge edges[1 + MAX_M];
vector<Edge*> neighbours[1 + MAX_N];
int answer[2 * MAX_M], nrs;
void euler(int u) {
for (Edge *e : neighbours[u]) {
if (!e->visited) {
e->visited = true;
euler(e->other(u));
}
}
nrs++;
answer[nrs] = u;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= m; i++) {
int p, q;
fin >> p >> q;
edges[i] = Edge{p, q, false};
neighbours[p].push_back(&edges[i]);
neighbours[q].push_back(&edges[i]);
}
fin.close();
int u = 1;
while (u <= n && neighbours[u].size() == 0)
u++;
if (u > n)
fout << "-1";
else {
euler(u);
if (nrs != m + 1)
fout << "-1";
else
for (int i = 1; i < nrs; i++)
fout << answer[i] << " ";
}
fout << '\n';
fout.close();
return 0;
}