Pagini recente » Cod sursa (job #2788840) | Cod sursa (job #2362587) | Cod sursa (job #2080995) | Statistici Brandon Muresan (BrandONN) | Cod sursa (job #1908081)
#include <iostream>
#include <stdio.h>
#include <vector>
#define MAXN 100003
#define MAXM 500003
#define inFile "ciclueuler.in"
#define outFile "ciclueuler.out"
using namespace std;
int n, m;
bool used[MAXM];
vector<unsigned int> G[MAXN];
vector<unsigned int> st;
vector<unsigned int> sol;
unsigned int A[MAXM], B[MAXM];
void read(void)
{
FILE * f = fopen(inFile, "r");
fscanf(f, "%d %d", &n, &m);
for (int i = 1, x, y; i <= m; i++)
{
fscanf(f, "%d %d", &x, &y);
G[x].push_back(i);
G[y].push_back(i);
A[i] = x;
B[i] = y;
}
fclose(f);
}
void euler(int nod)
{
for (vector<unsigned int>::iterator i = G[nod].begin(); i != G[nod].end(); i++)
{
if (!used[*i])
{
used[*i] = 1;
if (A[*i] == nod) euler(B[*i]); else euler(A[*i]);
}
}
cout << nod << " ";
}
void dfs(int nod)
{
st.push_back(nod);
while (!st.empty())
{
int nod = st.back();
if (!G[nod].empty())
{
int muchie = G[nod].back(); G[nod].pop_back();
if (!used[muchie])
{
used[muchie] = 1;
if (A[muchie] == nod)
st.push_back(B[muchie]);
else
st.push_back(A[muchie]);
}
}
else
{
st.pop_back();
sol.push_back(nod);
}
}
}
bool IsOkay()
{
for (int i = 1; i <= n; i++)
if (G[i].size() % 2)
return false;
return true;
}
void write()
{
FILE * g = fopen(outFile, "w");
if (!IsOkay())
{
fprintf(g, "-1");
}
else
{
sol.pop_back();
for (vector<unsigned int>::iterator i = sol.begin(); i != sol.end(); i++)
fprintf(g, "%d ", *i);
}
fclose(g);
}
int main()
{
read();
dfs(1);
write();
return 0;
}