Pagini recente » Cod sursa (job #1595624) | Cod sursa (job #1976920) | Cod sursa (job #150348) | Cod sursa (job #375014) | Cod sursa (job #1028401)
#include <cstdio>
#include <list>
#include <stack>
#include <queue>
#define nmax 100010
using namespace std;
int n,m;
list<int> a[nmax],sol;
stack<int> s;
int grad[nmax],viz[nmax];
void citire()
{
int i,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
grad[x]++;
grad[y]++;
a[x].push_back(y);
a[y].push_back(x);
}
}
queue<int> q;
void BFS(int vf)
{
int v;
typeof(a[vf].begin()) i;
q.push(vf);
while(!q.empty())
{
vf=q.front();
q.pop();
for(i=a[vf].begin();i!=a[vf].end();i++)
{
v=*i;
if(!viz[v])
{
q.push(v);
viz[v]=1;
}
}
}
}
bool este_conex()
{
BFS(1);
for(int i=2;i<=n;i++)
if(!viz[i])
return 0;
return 1;
}
bool grad_par()
{
for(int i=1;i<=n;i++)
if(grad[i]%2==1)
return 0;
return 1;
}
void sterge(int vf, int v)
{
grad[vf]--;
grad[v]--;
a[vf].pop_front();
for(typeof(a[v].begin()) i=a[v].begin();i!=a[v].end();i++)
if(vf==*i)
{
a[v].erase(i);
break;
}
}
void euler(int vf)
{
int v;
while(grad[vf])
{
v=a[vf].front();
s.push(vf);
sterge(vf,v);
vf=v;
}
}
void caut_ciclu()
{
int vf=1;
do
{
euler(vf);
vf=s.top();
s.pop();
sol.push_back(vf);
}while(!s.empty());
}
void afisare()
{
typeof(sol.begin()) i;
for(i=sol.begin();i!=sol.end();i++)
printf("%d ",*i);
}
void rez()
{
if(!este_conex())
printf("-1");
else if(!grad_par)
printf("-1");
else
{
caut_ciclu();
afisare();
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
citire();
rez();
return 0;
}