Pagini recente » Cod sursa (job #1675907) | Cod sursa (job #814384) | Cod sursa (job #2518029) | Cod sursa (job #859847) | Cod sursa (job #1332208)
#include <cstdio>
#include <vector>
#define Nmax 100005
#define Mmax 500005
using namespace std;
struct Edge
{
int nod,poz;
};
vector <Edge> L[Nmax];
bool vizedge[Mmax],fr[Nmax];
int n,x,y,grad[Nmax],sol[Mmax],lensol,nrviz;
inline void Dfs1(int nod)
{
fr[nod]=true; ++nrviz;
vector <Edge> ::iterator it;
for(it=L[nod].begin();it!=L[nod].end();++it)
if(!fr[it->nod]) Dfs1(it->nod);
}
inline bool Euler()
{
int i;
for(i=1;i<=n;++i)
if(grad[i]&1) return false;
Dfs1(1);
if(nrviz<n) return false;
return true;
}
inline void Dfs(int nod)
{
vector <Edge> ::iterator it;
for(it=L[nod].begin();it!=L[nod].end();++it)
if(!vizedge[it->poz])
{
vizedge[it->poz]=true;
Dfs(it->nod);
}
sol[++lensol]=nod;
}
int main()
{
int i,m,x,y;
Edge w;
freopen ("ciclueuler.in","r",stdin);
freopen ("ciclueuler.out","w",stdout);
scanf("%d%d", &n,&m);
for(i=1;i<=m;++i)
{
vizedge[i]=false;
scanf("%d%d", &x,&y);
++grad[x]; ++grad[y];
w.nod=y; w.poz=i; L[x].push_back(w);
w.nod=x; w.poz=i; L[y].push_back(w);
}
if(!Euler())
{
printf("-1\n");
return 0;
}
Dfs(1);
for(i=1;i<=m;++i) printf("%d ", sol[i]);
return 0;
}