Pagini recente » Cod sursa (job #1459532) | Cod sursa (job #1174698) | Cod sursa (job #696899) | Cod sursa (job #633289) | Cod sursa (job #1409508)
#include <cstdio>
#include <vector>
#include <stack>
#define nmax 100001
using namespace std;
int n, m;
int Grad[nmax];
vector <int> G[nmax];
stack <int> s, sol;
FILE *fi, *fo;
bool gradImpar()
{
for (int i = 1; i <= n; i++)
if (Grad[i] % 2 == 1)
return 1;
return 0;
}
void sterge(int deSters, int nod)
{
for (vector <int> :: iterator it = G[nod].begin(); it != G[nod].end(); ++it)
if (*it == deSters)
{
G[nod].erase(it);
return;
}
}
void euler(int nod)
{
s.push(nod);
while (!s.empty()){
int nod = s.top();
if (G[nod].size())
{
int vecin = G[nod][0];
G[nod].erase(G[nod].begin());
sterge(nod, vecin); // sterge nodul din vecinii veciniului
s.push(vecin);
}
else
{
sol.push(nod);
s.pop();
}
}
}
int main()
{
fi = fopen("ciclueuler.in", "r");
fo = fopen("ciclueuler.out", "w");
fscanf(fi, "%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
int x, y;
fscanf(fi, "%d%d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
Grad[x]++, Grad[y]++;
}
if (gradImpar())
{
fprintf(fo, "%d\n", -1);
return 0;
}
euler(1);
while (sol.size() > 1)
{
fprintf(fo, "%d ", sol.top());
sol.pop();
}
fclose(fi);
fclose(fo);
return 0;
}