Pagini recente » Cod sursa (job #3281344) | Autentificare | Statistici Culda Nicolae (nicolaeculda) | Cod sursa (job #1963645) | Cod sursa (job #1317967)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream is ("ciclueuler.in");
ofstream os ("ciclueuler.out");
vector <int> ::iterator it;
vector <int > V[100010], g, v, answ;
queue <int> Q;
vector <bool> viz;
int N, M;
void Read();
void BFS();
void Solve(int x);
bool Ok();
void Erase(int x, int y);
int main()
{
Read();
BFS();
if(!Ok) os << -1;
else
{
int nod = 1;
do {
Solve( nod );
nod = v[v.size()-1];
v.pop_back();
answ.push_back( nod );
} while( !v.empty() );
for(it = answ.begin(); it != answ.end(); ++it)
os << *it << " ";
}
is.close();
os.close();
return 0;
}
void Read()
{
int x, y;
is >> N >> M;
viz.resize(N+1, false);
g.resize(N+1);
for(int i = 1; i <= M; ++i)
{
is >> x >> y;
V[x].push_back(y);
V[y].push_back(x);
g[x]++, g[y]++;
}
}
void BFS()
{
int nod;
Q.push(1);
viz[1] = true;
while(!Q.empty())
{
nod = Q.front();
Q.pop();
for(it = V[nod].begin(); it != V[nod].end(); ++it)
if(!viz[*it])
{
viz[*it] = true;
Q.push(*it);
}
}
}
bool Ok()
{
for(int i = 1; i <= N; ++i)
if(!viz[i] || g[i]%2)
return false;
return true;
}
void Solve(int x)
{
int y;
while(true)
{
if(!V[x].size())
break;
y = V[x][V[x].size()-1];
v.push_back(x);
V[x].pop_back();
Erase(x, y);
x = y;
}
}
void Erase(int x, int y)
{
for(it = V[y].begin(); it != V[y].end(); ++it)
if(*it == x)
{
V[y].erase(it);
break;
}
}