Pagini recente » Cod sursa (job #2392611) | Cod sursa (job #2900490) | Cod sursa (job #288654) | Cod sursa (job #2638591) | Cod sursa (job #920607)
Cod sursa(job #920607)
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int MAX_N = 100002;
int N, M, x, y;
int m[MAX_N], grad[MAX_N];
vector < int > ciclu, v[MAX_N];
queue < int > Q;
stack < int > st;
inline void BFS(int st)
{
m[st] = 1, Q.push(st);
while(!Q.empty())
{
int x = Q.front();
Q.pop();
for(int i = 0; i < v[x].size(); ++i)
{
int y = v[x][i];
if(!m[y])
m[y] = 1, Q.push(y);
}
}
}
inline int graf_eulerian()
{
BFS(1);
for(int i = 2; i <= N; ++i)
if(!m[i])
return 0;
for(int i = 1; i <= N; ++i)
if(grad[i] % 2)
return 0;
return 1;
}
inline void sterge_muchia(int x, int y);
inline void euler(int x)
{
while(!v[x].empty())
{
int y = v[x].front();
sterge_muchia(x, y);
sterge_muchia(y, x);
st.push(x);
x = y;
}
}
inline void sterge_muchia(int x, int y)
{
for(int i = 0; i < v[x].size(); ++i)
if(v[x][i] == y)
{
v[x].erase(v[x].begin()+i);
return;
}
}
int main()
{
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
f >> N >> M;
for(int i = 1; i <= M; ++i)
{
f >> x >> y;
v[x].push_back(y), v[y].push_back(x);
++grad[x], ++grad[y];
}
if(graf_eulerian())
{
int x = 1;
do
{
euler(x);
x = st.top(), st.pop();
ciclu.push_back(x);
}while(!st.empty());
for(int i = 0; i < ciclu.size(); ++i)
g << ciclu[i] << " ";
}
else g << -1;
g << '\n';
f.close();
g.close();
return 0;
}