Pagini recente » Cod sursa (job #2849308) | Cod sursa (job #1303109) | Cod sursa (job #1579431) | Cod sursa (job #367422) | Cod sursa (job #849593)
Cod sursa(job #849593)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#define TR( C, it ) for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
int N, M;
vector <int> muchii[500011];
int visited[100011];
stack <int> stiva;
vector <int> Answer;
queue <int> QQ;
void Citire ()
{
ifstream fin ("ciclueuler.in");
fin >> N >> M;
for (int i = 0, a, b; i < M; i++)
{
fin >> a >> b;
muchii[a].push_back (b);
muchii[b].push_back (a);
}
fin.close ();
}
void BFS ()
{
visited[1] = 1;
QQ.push (1);
while (!QQ.empty ())
{
int a = QQ.front ();
QQ.pop ();
for (int i = muchii[a].size () - 1; i >= 0; i--)
{
if (visited[muchii[a][i]]) continue;
visited[muchii[a][i]] = 1;
QQ.push (muchii[a][i]);
}
}
}
int Eulerian ()
{
BFS ();
for (int i = 1; i <= N; i++)
if ((!visited[i]) || (muchii[i].size () % 2)) return 0;
return 1;
}
void Sterge (int v, int u)
{
muchii[v].pop_back ();
TR (muchii[u], it)
{
if (*it == v)
{
muchii[u].erase (it);
break;
}
}
}
void Euler (int nod)
{
while (1)
{
if (muchii[nod].empty ()) return;
int w = muchii[nod].back ();
Sterge (nod, w);
stiva.push (nod);
nod = w;
}
}
void Business ()
{
int nod = 1;
do
{
Euler (nod);
nod = stiva.top ();
stiva.pop ();
Answer.push_back (nod);
} while (!stiva.empty ());
}
void Scriere ()
{
ofstream fout ("ciclueuler.out");
if (!Eulerian ())
{
fout << "-1";
fout.close ();
return;
}
while (!Answer.empty ())
{
fout << Answer.back () << " ";
Answer.pop_back ();
}
fout.close ();
}
int main ()
{
Citire ();
Business ();
Scriere ();
return 0;
}