Pagini recente » Cod sursa (job #16341) | Cod sursa (job #218770) | Cod sursa (job #2667040) | Cod sursa (job #766817) | Cod sursa (job #2664915)
#include <iostream>
#include <queue>
#include <stack>
#include <fstream>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct nod
{
int info;
nod *urm;
}*l[100001];
int gr[100001], n, m;
stack <int> st;
queue <int> q;
bool fr[100001];
void adauga(int i, int j)
{
nod *p=new nod;
p->info=j;
p->urm=l[i];
l[i]=p;
}
void citire()
{
fin>>n>>m;
int x, y;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
adauga(x,y);
adauga(y,x);
gr[x]++;
gr[y]++;
}
fin.close();
}
void dfs(int poz)
{
st.push(poz);
int top;
fr[poz]=1;
while(!st.empty())
{
top=st.top();
st.pop();
for(nod *p=l[top];p!=NULL;p=p->urm)
{
if(fr[p->info]==0)
{
fr[p->info]=fr[top]+1;
st.push(p->info);
}
}
}
}
int verif_eulerian()
{
for(int i=1;i<=n;i++)
if(gr[i]%2==1)
return 0;
return 1;
}
int verif_conex()
{
dfs(1);
for(int i=1;i<=n;i++)
if(fr[i]==0)
return 0;
return 1;
}
void sterge(int i,int j)
{
if(l[i]->info==j)
{
nod *a=l[i];
l[i]=l[i]->urm;
delete a;
}
else
{
nod *a=l[i];
nod *p=l[i]->urm;
while(p!=NULL)
{
if(p->info==j)
{
a->urm=p->urm;
delete p;
break;
}
else
{
a=a->urm;
p=p->urm;
}
}
}
}
void euler(int x)
{
while(l[x]!=NULL)
{
int y=l[x]->info;
sterge(x,y);
sterge(y,x);
euler(y);
}
q.push(x);
}
void rezolvare()
{
if(verif_conex()==1 and verif_eulerian()==1)
{
euler(1);
while(!q.empty())
{
if(q.size()>1)
fout<<q.front()<<' ';
q.pop();
}
}
else
{
fout<<-1<<'\n';
}
fout.close();
}
int main()
{
citire();
rezolvare();
return 0;
}