Pagini recente » Cod sursa (job #145847) | Cod sursa (job #1681938) | Cod sursa (job #998425) | Cod sursa (job #1784479) | Cod sursa (job #1133552)
#include <fstream>
#include <list>
#include <vector>
using namespace std;
struct muchie
{
int a,b;
bool viz;
};
#define NMAX 100005
int deg[NMAX];
vector<muchie*> graf[NMAX];
list<int> sol;
list<int>::iterator unde;
int tata[NMAX];
int marime[NMAX];
int f(int x)
{
if(tata[x]!=x)
tata[x]=f(tata[x]);
return tata[x];
}
inline void uneste(int a,int b)
{
a=f(a),b=f(b);
marime[b]+=marime[a];
tata[a]=b;
}
void expand(int nod)
{
while(1)
{
while(graf[nod].size() && (*(graf[nod].end()-1))->viz==1)
graf[nod].pop_back();
if(graf[nod].size())
{
(*(graf[nod].end()-1))->viz=1;
nod=(*(graf[nod].end()-1))->a+(*(graf[nod].end()-1))->b-nod;
sol.insert(unde,nod);
}
else
break;
}
}
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
void euler()
{
sol.push_back(1);
for(list<int>::iterator it=sol.begin();it!=sol.end();it++)
{
cout<<*it<<' ';
it++;
unde=it;
it--;
expand(*it);
}
cout<<'\n';
}
int main()
{
int n=0,m=0,i,a,b;
cin>>n>>m;
for(i=1;i<=n;i++)
tata[i]=i,marime[i]=1;
for(i=0;i<m;i++)
{
muchie *x;
x=new muchie;
cin>>a>>b;
x->a=a;
x->b=b;
x->viz=0;
uneste(a,b);
deg[a]++;
deg[b]++;
graf[a].push_back(x);
graf[b].push_back(x);
}
bool ok=true;
for(i=1;i<=n;i++)
{
if(marime[i]>1)
if(f(i)!=f(1))
{
ok=false;
break;
}
if(deg[i]&1)
{
ok=false;
break;
}
}
if(!ok)
{
cout<<"-1\n";
cin.close();
cout.close();
return 0;
}
euler();
cin.close();
cout.close();
return 0;
}