Pagini recente » Cod sursa (job #110250) | Cod sursa (job #1407004) | Cod sursa (job #778804) | Cod sursa (job #1429011) | Cod sursa (job #2663767)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#define MAXN 100001
#define MAXM 500001
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n,m;
struct muc{
int dest;
bool went;
};
struct nod{
muc mc;
nod *urm;
};
nod *MC[MAXM];
void add(int x,muc y){
if(MC[x]==NULL){
MC[x]=new nod;
MC[x]->mc=y;
MC[x]->urm=NULL;
}
else{
nod *q=new nod;
q->mc=y;
q->urm=MC[x];
MC[x]=q;
}
}
void close(int x,int y){
nod *i=new nod;
if(MC[x]->mc.dest==y){
MC[x]=MC[x]->urm;
return;
}
i=MC[x];
for(;i->urm!=NULL;i=i->urm){
if(i->urm->mc.dest==y){
i->urm=i->urm->urm;
return;
}
}
if(i->mc.dest==y)
i=NULL;
}
void afis(){
for(int i=1;i<=n;i++){
nod *j=new nod;
for(j=MC[i];j!=NULL;j=j->urm){
fout<<i<<' '<<j->mc.dest<<' '<<j->mc.went<<'\n';
}
fout<<"*\n";
}
}
queue <int> myq;
stack <int> myst;
int grad[MAXN],nrgoodgrad;
int main(){
fin>>n>>m;
for(int i=1;i<=m;i++){
muc x,y;
fin>>x.dest>>y.dest;
y.went=0;
x.went=0;
grad[x.dest]++;
if(grad[x.dest]%2==0) nrgoodgrad++;
else nrgoodgrad--;
grad[y.dest]++;
if(grad[y.dest]%2==0) nrgoodgrad++;
else nrgoodgrad--;
add(x.dest,y); add(y.dest,x);
}
if(nrgoodgrad!=0){
fout<<-1;
return 0;
}
myst.push(1);
while(!myst.empty()){
int nod=myst.top();
if(MC[nod]!=NULL){
myst.push(MC[nod]->mc.dest);
close(MC[nod]->mc.dest,nod);
MC[nod]=MC[nod]->urm;
}
else{
myst.pop();
myq.push(nod);
}
}
while(myq.size()>1){
fout<<myq.front()<<' ';
myq.pop();
}
return 0;
}