Pagini recente » Cod sursa (job #2835197) | Cod sursa (job #1593930) | Cod sursa (job #1932145) | Cod sursa (job #1864771) | Cod sursa (job #899698)
Cod sursa(job #899698)
#include<stdio.h>
#include<list>
#include <stack>
#include <queue>
using namespace std;
#define TR( C, it ) \
for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
#define nmax 100010
#define pb push_back
int n,m, deg[ nmax ], col[ nmax ];
list<int> graf[nmax], l;
stack< int > s;
queue< int > q;
void cit()
{
int u,v;
scanf("%i%i",&n,&m);
while(m--)
{
scanf("%d%d",&u,&v);
graf[u].pb(v); ++deg[u];
graf[v].pb(u); ++deg[v];
}
}
void bfs(int v)
{
q.push(v); col[v]=1;
while(!q.empty()){
v=q.front(); q.pop();
TR( graf[v],w )
if(!col[*w])
q.push(*w),col[*w]=1;
}
}
int esteconex()
{
bfs(1);
for(int i=1;i!= n;i++)
{
if(!col[i])
return 0;
}
return 1;
}
int eulerian()
{
if(!esteconex())
return 0;
for(int i=1;i<=n;i++)
{
if(deg[i]%2)
return 0;
}
return 1;
}
void sterge (int i, int j)
{
--deg[i];
--deg[j];
graf[i].pop_front();
TR(graf[j],it)
if(*it==i)
{
graf[j].erase(it);
break;
}
}
void euler(int i)
{
while(true)
{
if(graf[i].empty())
break;
int j=graf[i].front();
s.push(i);
sterge(i,j);
i=j;
}
}
int rez()
{
int i=eulerian();
if(!i)
return(-1);
do
{
euler(i);
i=s.top();
s.pop();
l.pb(i);
} while(!s.empty());
return 1;
}
void scr(int i)
{
if(i==-1)
printf("-1\n");
else
{
TR(l, i)
printf("%d", *i);
printf("\n");
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
cit();
scr(rez());
}