Pagini recente » Cod sursa (job #2714503) | Cod sursa (job #1304829) | Cod sursa (job #1276739) | Cod sursa (job #1507225) | Cod sursa (job #1046196)
#include<cstdio>
#include<bitset>
#include<vector>
#include<deque>
#define NMAX 100000+5
using namespace std;
int N,M;
int Grad[NMAX];
vector<int> V[NMAX];
vector<int> S;
deque<int> Q;
bitset<NMAX> viz;
bool eulerian()
{
int x,i;
vector<int>::iterator it;
//BFS din 1
Q.push_back(1);
viz[1]=1;
for(;!Q.empty();)
{
x=Q.front();
Q.pop_front();
for(it=V[x].begin();it!=V[x].end();it++)
{
if(viz[*it]) continue;
viz[*it]=1;
Q.push_back(*it);
}
}
//Este conex si gradele sunt pare?
for(i=1;i<=N;i++)
if(viz[i]==0 || Grad[i]%2) return 0;
return 1;
}
void scrieCiclu()
{
int x,y;
vector<int>::iterator it;
Q.push_back(1);
for(;!Q.empty();)
{
x=Q.back();
if(Grad[x])
{
y=V[x].back();
V[x].pop_back();
for(it=V[y].begin();it!=V[y].end();it++)
if(*it==x)
{
swap(*it,V[y].back());
V[y].pop_back();
break;
}
Q.push_back(y);
Grad[x]--;
Grad[y]--;
}
else
{
S.push_back(Q.back());
Q.pop_back();
}
}
for(it=S.begin();it!=S.end();it++)
printf("%d ",*it);
}
int main()
{
int a,b;
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&N,&M);
for(;M;--M)
{
scanf("%d%d",&a,&b);
V[a].push_back(b); Grad[a]++;
V[b].push_back(a); Grad[b]++;
}
if(eulerian()) scrieCiclu();
else printf("-1\n");
return 0;
}