Pagini recente » Cod sursa (job #2099908) | Cod sursa (job #1074240) | Cod sursa (job #2514332) | Cod sursa (job #1759555) | Cod sursa (job #1349494)
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
fstream fin("ciclueuler.in", ios::in);
fstream fout("ciclueuler.out", ios::out);
# define MAXN 100001
vector <int> list[MAXN], euler_cycle, cycle;
vector <int>::iterator it;
int n, m;
void read()
{
int x, y;
fin >> n >> m;
for (int i = 1; i <= m; i++)
fin >> x >> y,
list[x].push_back(y),
list[y].push_back(x);
fin.close();
}
bool is_euler()
{
for (int i = 1; i <= n; i++)
if (list[i].size() % 2 != 0 || !list[i].size()) return false;
return true;
}
void find_cycle(int node)
{
cycle.push_back(node);
if (list[node].size())
{
int next_node = list[node].front();
it = find(list[next_node].begin(), list[next_node].end(), node);
list[next_node].erase(it);
list[node].erase(list[node].begin());
find_cycle(next_node);
}
}
inline void add_cycle(int position)
{
euler_cycle.insert(euler_cycle.begin() + position + 1, cycle.begin() + 1, cycle.end());
cycle.clear();
}
int main()
{
read();
if (!is_euler())
{
fout << "-1";
fout.close();
return 0;
}
euler_cycle.push_back(1);
int end_grades = 0, i;
while (!end_grades)
{
for (i = 0; i < euler_cycle.size() && !list[euler_cycle[i]].size(); i++);
if (i < euler_cycle.size())
find_cycle(euler_cycle[i]),
add_cycle(i);
else end_grades = 1;
}
for (int i = 0; i < euler_cycle.size() - 1; i++)
fout << euler_cycle[i] << " ";
fout.close();
return 0;
}