Pagini recente » Cod sursa (job #2437435) | Cod sursa (job #892351) | Cod sursa (job #24684) | Cod sursa (job #1448630) | Cod sursa (job #913040)
Cod sursa(job #913040)
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 100000
#define MAXM 500000
using namespace std;
vector <int> v[MAXN+1];
int c[MAXM+2],c1[MAXM+2],m,n,p;
void citire()
{
int x,y;
freopen("ciclueuler.in","r",stdin);
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
}
int par()
{
int s;
for(int i=1;i<=n;i++)
{
s=v[i].size();
if(s%2==1 || s==0)
return 0;
}
return 1;
}
int conex()
{
int q[MAXN+1],viz[MAXN+1],p,u;
p=1;
u=1;
memset(viz,0,sizeof(viz));
q[1]=1;
viz[1]=1;
vector <int>::iterator it;
while(p<=u)
{
for(it=v[q[p]].begin();it!=v[q[p]].end();it++)
{
if(viz[(*it)]==0)
{
q[++u]=(*it);
viz[q[u]]=1;
}
}
p++;
}
if(u==n)
return 1;
return 0;
}
void sterge(int x,int y)
{
vector<int>:: iterator it;
for(it=v[x].begin();it!=v[x].end();it++)
{
if((*it)==y)
{
v[x].erase(it);
break;
}
}
}
int cicluNou(int st)
{
int p1;
c1[1]=st;
p1=1;
do
{
p1++;
c1[p1]=v[c1[p1-1]].front();
v[c1[p1-1]].erase(v[c1[p1-1]].begin());
sterge(c1[p1],c1[p1-1]);
}while(c1[p1]!=st);
return p1;
}
void deplasare(int poz,int l)
{
for(int i=p;i>=poz+1;i--)
{
c[i+l-1]=c[i];
}
}
void intercl(int poz,int l)
{
for(int i=1;i<=l;i++)
{
c[i+poz-1]=c1[i];
}
}
void ciclu()
{
int l;
p=1;
c[1]=1;
vector <int>::iterator it;
do
{
c[++p]=v[c[p-1]].front();
v[c[p-1]].erase(v[c[p-1]].begin());
sterge(c[p],c[p-1]);
}while(c[p]!=1);
while(p<=m-1)
{
for(int i=1;i<=p-1;i++)
{
if(!v[c[i]].empty())
{
l=cicluNou(c[i]);
deplasare(i,l);
intercl(i,l);
p+=l-1;
}
}
}
}
void afisare()
{
for(int i=1;i<=p;i++)
{
printf("%d ",c[i]);
}
}
int main()
{
freopen("ciclueuler.out","w",stdout);
citire();
if(!par() || !conex())
{
printf("-1");
return 0;
}
ciclu();
afisare();
return 0;
}