Pagini recente » Borderou de evaluare (job #1410367) | Cod sursa (job #1032956) | Istoria paginii runda/pgleague | Cod sursa (job #1517096) | Cod sursa (job #1242783)
# include <bits/stdc++.h>
# define p(x) int(S[x].size())
using namespace std;
ifstream fi("ciclueuler.in");
ofstream fo("ciclueuler.out");
const int nmax = 1000010;
stack < int > s;
vector < int > S[nmax];
int Sol[nmax];
bool b[nmax];
void bfs()
{
queue < int > q;
q.push(1);
while (q.size())
{
int v=q.front();q.pop();
for (vector < int > ::iterator i=S[v].begin();i!=S[v].end();++i) if (!b[*i]) q.push(*i),b[*i]=1;
}
}
bool eulerian(int n)
{
bfs();
for (int i=1;i<=n;++i) if (!b[i] || (p(i) & 1)) return 0;
return 1;
}
int main(void)
{
int n,m;
fi>>n>>m;
int x,y;
while (m--) fi>>x>>y,S[x].push_back(y),S[y].push_back(x);
if (!eulerian(n)) return fo<<"-1\n",0;
s.push(1);
while (s.size())
{
int v=s.top();
if (!p(v)) Sol[++Sol[0]]=v,s.pop();
else
{
int to=S[v][p(v)-1];
s.push(to);
S[v].pop_back();
S[to].erase(find(S[to].begin(),S[to].end(),v));
}
}
for (int i=1;i<Sol[0];++i) fo << Sol[i] << ' ';
return 0;
}