Pagini recente » Cod sursa (job #2915755) | Cod sursa (job #2361601) | Cod sursa (job #3126312) | Cod sursa (job #2499517) | Cod sursa (job #1243036)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
const int MAX=100005;
vector <int> lista[MAX];
vector <pair <int,int> > muc;
stack <int> s;
vector <int> sol;
int n,m,grad[MAX];
bool viz[MAX];
void dfs(int nod);
void ciclu();
int main()
{
int i,x,y;
fin>>n>>m;
for(i=0;i<m;++i)
{
fin>>x>>y;
muc.push_back(make_pair(x,y));
lista[x].push_back(i);
lista[y].push_back(i);
grad[x]++;
grad[y]++;
}
dfs(1);
for(i=1;i<=n;++i)
if(grad[i]&1 or !viz[i])
{
fout<<-1<<'\n';
return 0;
}
ciclu();
for(i=0;i<sol.size()-1;++i)
fout<<sol[i]<<' ';
return 0;
}
void dfs(int nod)
{
viz[nod]=1;
for(int i=0;i<lista[nod].size();++i)
{
int next=muc[lista[nod][i]].first;
if(nod==next)
next=muc[lista[nod][i]].second;
if(!viz[next])
dfs(next);
}
}
void ciclu()
{
int nod=1;
s.push(nod);
while(!s.empty())
{
nod=s.top();
if(lista[nod].size())
{
int i=lista[nod].back();
lista[nod].pop_back();
int next=muc[i].first;
if(nod==next)
next=muc[i].second;
muc[i].first=muc[i].second=0;
if(next!=0)
s.push(next);
}
else
{
sol.push_back(nod);
s.pop();
}
}
}