Pagini recente » Cod sursa (job #667235) | Cod sursa (job #240034) | Cod sursa (job #2152257) | Cod sursa (job #2110844) | Cod sursa (job #613444)
Cod sursa(job #613444)
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<bitset>
#define infile "ciclueuler.in"
#define outfile "ciclueuler.out"
#define n_max 100005
#define FOR(v, it) \
for(vector<int> :: iterator it = v.begin(); it!=v.end(); ++it)
using namespace std;
void afiseaza(int);
int conex();
vector <int> g[n_max];
stack <int> S;
int n;
void citeste()
{
freopen(infile,"r",stdin);
int m, x, y;
scanf("%d %d",&n,&m);
while(m--)
{
scanf("%d %d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
fclose(stdin);
}
int grade_pare()
{
for(int i=1;i<=n;i++)
if( g[i].size() & 1)
return 0;
return 1;
}
int eulerian()
{
return grade_pare() && conex();
}
int conex()
{
queue <int> q;
bitset <n_max> uz;
int x, y, c;
for(q.push(c = 1), uz.set(1); !q.empty() && c<n; q.pop())
FOR(g[x = q.front()], it)
if(!uz[y = *it])
{
c++;
uz.set(y);
q.push(y);
}
return n == c;
}
void rezolva()
{
if(!eulerian())
{
afiseaza(-1);
return;
}
S.push(1);
int x,y;
while (!S.empty())
{
x = S.top();
if(g[x].size())
{
y = g[x].back();
S.push(y);
g[x].pop_back();
FOR(g[y],it)
if(x == *it)
{
g[y].erase(it);
break;
}
continue;
}
S.pop();
if(!S.empty())
afiseaza(x);
}
}
void afiseaza(int x)
{
printf("%d ",x);
}
int main()
{
freopen(outfile,"w",stdout);
citeste();
rezolva();
fclose(stdout);
return 0;
}