Pagini recente » Cod sursa (job #2140159) | Cod sursa (job #3271789) | Cod sursa (job #1059802) | Cod sursa (job #1958490) | Cod sursa (job #1223711)
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<vector>
#include<algorithm>
using namespace std;
#define maxn 500005
vector <int> a[maxn];
int i,n,m,x,y,nr;
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){
if(a[nod].size()){
int vecin=a[nod].back();
a[nod].pop_back();
int j=a[vecin].size()-1;
while(j>=0 && a[vecin][j]!=nod) j--;
a[vecin][j]=a[vecin].back();
a[vecin].pop_back();
//a[vecin].erase(find(a[vecin].begin(),a[vecin].end(),nod));
euler(vecin);
}
nr++;
if(nr<=m) printf("%d ",nod);
}
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()) euler(1);
else printf("-1");
fclose(stdin);
fclose(stdout);
return 0;
}