Pagini recente » Cod sursa (job #1561802) | Cod sursa (job #778267) | Rating Vehuiah Vehuiah (Vehuiah) | Borderou de evaluare (job #705087) | Cod sursa (job #586832)
Cod sursa(job #586832)
#include <stdio.h>
#include <list>
#include <fstream>
#include <stack>
#define TR( C, it ) \
for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
using namespace std;
int n,m,gr[100001],i,ok,luat[100001],sol[600004],x,y,q[100011];
struct nod{int y; nod *next;};
list <int> G[100001];
stack <int> S;
int dfs(int x)
{
int i=1;
q[0]=0;
q[++q[0]]=x;
while (i<=q[0])
{
TR (G[q[i]],it)
{
if (!luat[*it])
{
luat[*it]=1;
q[++q[0]]=*it;
}
}
i++;
}
return 0;
}
int caut(int v)
{
while (1)
{
if (gr[v]==0) break;
int w=G[v].front();
gr[v]--;
gr[w]--;
G[v].pop_front();
TR (G[w],it)
if (*it==v)
{G[w].erase(it); break;}
S.push(v);
v=w;
}
return 0;
}
int eulerian()
{
for (i=1;i<=n;i++)
if (gr[i]%2==1) return 0;
luat[1]=1;
dfs(1);
for (i=1;i<=n && ok;i++)
if (!luat[i])
return 0;
return 1;
}
int main(void)
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
gr[x]++;
gr[y]++;
}
if (!eulerian())
{
printf("-1\n");
return 0;
}
int v=1;
do
{
caut(v);
v=S.top();
S.pop();
sol[++sol[0]]=v;
}while (!S.empty());
for (i=1;i<=m;i++)
printf("%d ",sol[i]);
printf("\n");
return 0;
}