Pagini recente » Cod sursa (job #2734642) | Cod sursa (job #350334) | Cod sursa (job #589686) | Cod sursa (job #2959555) | Cod sursa (job #1028413)
#include <cstdio>
#include <stack>
#include <vector>
#include <queue>
#define nmax 100010
using namespace std;
struct nod
{
int inf;
nod *urm;
};
nod *a[nmax];
int n,m;
vector<int> sol;
stack<int> s;
int grad[nmax],viz[nmax];
void adaug(nod *&pr, int x)
{
nod *nou;
nou=new nod;
nou->inf=x;
nou->urm=pr;
pr=nou;
}
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]++;
adaug(a[x],y);
adaug(a[y],x);
}
}
queue<int> q;
void BFS(int vf)
{
int v;
nod *c;
q.push(vf);
while(!q.empty())
{
vf=q.front();
q.pop();
for(c=a[vf];c;c=c->urm)
{
v=c->inf;
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]=a[vf]->urm;
nod *c,*pred;
for(c=a[v];c;c=c->urm)
{
if(vf==c->inf)
{
if(c->inf==a[v]->inf)
a[v]=a[v]->urm;
else
{
pred->urm=c->urm;
delete c;
}
break;
}
pred=c;
}
}
void euler(int vf)
{
int v;
while(grad[vf])
{
v=a[vf]->inf;
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()
{
for(int i=0;i<sol.size();i++)
printf("%d ",sol[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;
}