Cod sursa(job #526711)
#include <fstream>
#include <list>
#include <queue>
#include <stack>
#define nmax 100002
using namespace std;
ifstream f("ciclueuler.in");
ofstream g1("ciclueuler.out");
list <int> g[nmax],sol;
stack <int> s;
int n,m,grad[nmax];
void citire ()
{
int u,v;
f>>n>>m;
for (int i=1; i<=m; i++)
{
f>>u>>v;
g[u].push_back(v); grad[u]++;
g[v].push_back(u); grad[v]++;
}
f.close ();
}
bool esteConex ()
{
bool viz[nmax]; int nod,noduri_vizitate;
memset (viz,false,sizeof(viz));
queue <int> q;
q.push(1);
viz[1]=true;
noduri_vizitate=1;
while (!q.empty())
{
nod=q.front ();
q.pop ();
list<int>::iterator i;
for (i=g[nod].begin(); i!=g[nod].end(); i++)
if (!viz[*i])
{
q.push (*i);
viz[*i]=true;
noduri_vizitate++;
}
}
if (noduri_vizitate==n)
return true;
else return false;
}
bool isEulerian ()
{
if (!esteConex())
return false;
else
for (int i=1; i<=n; i++)
if (grad[i]%2==1)
return false;
return true;
}
void sterge (int v,int w)
{
grad[v]--; grad[w]--;
g[v].pop_front ();
list<int>::iterator i;
for (i=g[w].begin(); i!=g[w].end(); i++)
if (*i==v)
{
g[w].erase(i);
return;
}
}
void euler (int v)
{
while (!g[v].empty())
{
int w=g[v].front ();
s.push (w);
sterge (v,w);
v=w;
}
}
void solve ()
{
int nod=1;
do
{
euler (nod);
nod=s.top(); s.pop();
sol.push_back(nod);
}
while (!s.empty());
}
void afisare ()
{
if (!isEulerian())
g1<<-1;
else
{
solve ();
list<int>::iterator i;
for (i=sol.begin(); i!=sol.end(); i++)
g1<<*i<<" ";
}
g1.close ();
}
int main ()
{
citire ();
afisare ();
return 0;
}