Pagini recente » Cod sursa (job #2952981) | Cod sursa (job #2025377) | Cod sursa (job #1600397) | Cod sursa (job #1040451) | Cod sursa (job #1223701)
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<vector>
#include<algorithm>
using namespace std;
#define maxn 500005
vector <int> a[maxn];
vector <int> sol;
int i,n,m,x,y;
bool viz[maxn];
void dfs(int nod){
viz[nod]=1;
for(int j=0;j<(int)a[nod].size();j++)
if(!viz[a[nod][j]]) dfs(a[nod][j]);
}
bool conex(){
for(int i=1;i<=n;i++) viz[i]=0;
dfs(1);
for(int i=1;i<=n;i++)
if(!viz[i]) return 0;
return 1;
}
bool grade_pare(){
for(int i=1;i<=n;i++)
if(a[i].size()%2==1) return 0;
return 1;
}
bool ciclu_eulerian(){
if(grade_pare() && conex()) return 1;
return 0;
}
void euler(int nod){
while(a[nod].size()){
int vecin=a[nod].back();
a[nod].pop_back();
a[vecin].erase(find(a[vecin].begin(),a[vecin].end(),nod));
euler(vecin);
if((int)sol.size()<m) sol.push_back(nod);
}
}
void afisare(){
euler(1);
for(int j=0;j<(int)sol.size();j++)
printf("%d ",sol[j]);
}
int main(){
assert(freopen("ciclueuler.in","r",stdin));
assert(freopen("ciclueuler.out","w",stdout));
assert(scanf("%d %d",&n,&m)==2);
for(i=1;i<=m;i++){
assert(scanf("%d %d",&x,&y)==2);
a[x].push_back(y);
a[y].push_back(x);
}
if(ciclu_eulerian()) afisare();
else printf("-1");
fclose(stdin);
fclose(stdout);
return 0;
}