Pagini recente » Cod sursa (job #342874) | Cod sursa (job #1710441) | Cod sursa (job #742914) | Cod sursa (job #379715) | Cod sursa (job #1645244)
#include<cstdio>
#include<vector>
#include<stack>
#include<bitset>
using namespace std;
#define NMAX 100005
#define MMAX 500005
vector < pair <int,int> > v[NMAX];
vector < pair <int,int> >::reverse_iterator it;
stack <int> st;
bitset <MMAX> viz;
bitset <NMAX> L;
int n,m,x,y,z,ok,start,D[NMAX];
void dfs(int s)
{
int i;
L[s]=1;
for (i=0;i<v[s].size();++i)
if (!L[v[s][i].first])
dfs(v[s][i].first);
}
int main()
{
int i;
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);
v[x].push_back(make_pair(y,i));
v[y].push_back(make_pair(x,i));
++D[x], ++D[y];
}
for (i=1;i<=n;++i)
if (D[i])
{
start=i;
dfs(i);
break;
}
for (i=1;i<=n;++i)
if ((D[i] && !L[i]) || D[i]%2)
{
printf("-1\n");
return 0;
}
ok=1;
st.push(start);
while (!st.empty())
{
x=st.top();
while (!v[x].empty())
{
it=v[x].rbegin();
y=it->first, z=it->second;
if (viz[z])
v[x].pop_back();
else
break;
}
if (v[x].empty())
{
if (!ok)
printf("%d ",x);
ok=0;
st.pop();
continue;
}
viz[z]=1;
st.push(y);
}
printf("\n");
return 0;
}