Pagini recente » Cod sursa (job #2852840) | Cod sursa (job #1767940) | Cod sursa (job #2011773) | Cod sursa (job #73574) | Cod sursa (job #1108979)
#include <iostream>
#include <cstdio>
#include <stack>
#include <list>
#include <queue>
#include <vector>
#define Nmax 100010
using namespace std;
list <int> Graf[Nmax];
vector <int>Sol;
stack <int> S;
queue <int> Coada;
int N,M;
int Grad[Nmax],Viz[Nmax];
void Citire()
{
int x,y;
scanf("%d %d",&N,&M);
for(int i=0;i<M;++i)
{
scanf("%d %d",&x,&y);
Graf[x].push_back(y);
Graf[y].push_back(x);
Grad[x]++;Grad[y]++;
}
}
void BFS()
{
Coada.push(1);
Viz[1]=1;
while(!Coada.empty())
{
int x=Coada.front();
Coada.pop();
list<int>::iterator it;
for(it=Graf[x].begin();it!=Graf[x].end();++it)
{
if(!Viz[*it])
{
Viz[*it]=1;
Coada.push(*it);
}
}
}
}
int Este_eulerian()
{
BFS();
for(int i=1;i<=N;++i)
if(Viz[i]==0)
return 0;
for(int i=1;i<=N;++i)
if(Grad[i]%2!=0)
return 0;
return 1;
}
void Sterge(int v,int w)
{
Graf[v].pop_front();
list<int>::iterator it;
for(it=Graf[w].begin();it!=Graf[w].end();++it)
if(*it==v)
{
Graf[w].erase(it);
break;
}
}
void Euler(int v)
{
while(!Graf[v].empty())
{
int w=Graf[v].front();
S.push(v);
Sterge(v,w);
v=w;
}
}
void Rezolvare()
{
int v;
S.push(1);
while(!S.empty())
{
v=S.top();
S.pop();
Euler(v);
Sol.push_back(v);
}
}
void Afisare()
{
for(int i=0;i<Sol.size()-1;++i)
printf("%d ",Sol[i]);
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
Citire();
if(!Este_eulerian())
printf("-1");
else
{
Rezolvare();
Afisare();
}
return 0;
}