Pagini recente » Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Borderou de evaluare (job #570761) | Cod sursa (job #1248842)
#include <fstream>
#include <bitset>
#include <stack>
#include <queue>
#include <list>
#define DIM 100011
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m;
int D[DIM];
list<int> L[DIM],sol;
stack<int> S;
queue<int> Q;
bitset<DIM> viz;
inline bool conex(){
list<int>::iterator it;
int nod,nr=1;
Q.push(1),viz[1]=1;
while(!Q.empty()){
nod=Q.front(),Q.pop();
for(it=L[nod].begin();it!=L[nod].end();it++)
if(!viz[*it]) Q.push(*it),viz[*it]=1,nr++;
}
if(nr==n)
return true;
else{
for(register int i=1;i<=n;i++)
if(!viz[i]&&D[i])
return false;
return true;
}
}
void stergere(int x,int y){
list<int>::iterator it;
D[x]--,D[y]--;
L[x].pop_front();
for(it=L[y].begin();it!=L[y].end();it++)
if(*it==x){
L[y].erase(it);
break;
}
}
void euler(int nod){
int w;
while(!L[nod].empty()){
w=L[nod].front();
stergere(nod,w);
S.push(nod),nod=w;
}
}
int main(void){
register int i,j,x,y,nr=0;
list<int>::iterator it;
f>>n>>m;
for(i=1;i<=m;i++)
f>>x>>y,L[x].push_back(y),L[y].push_back(x),D[x]++,D[y]++;
for(i=1;i<=n;i++)
if(D[i]%2){
g<<"-1";
f.close(),g.close();
return 0;
}
if(!conex()){
g<<"-1";
return 0;
}
int nod=1;
viz.reset();
for(i=1;i<=n;i++) if(!D[i]) sol.push_front(i);
do{
euler(nod);
nod=S.top(),S.pop();
sol.push_front(nod);
}while(!S.empty());
for(it=sol.begin();it!=sol.end();it++)
g<<*it<<" ";
f.close(),g.close();
return 0;
}