Pagini recente » Cod sursa (job #102210) | Cod sursa (job #2769686) | Cod sursa (job #273169) | Cod sursa (job #3264681) | Cod sursa (job #1846473)
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,v[NMAX],st[10000000],k,muchii,m;
struct nod{
int info;
nod* urm;
}*G[NMAX];
nod* inserare_inceput(nod* p,int x){
nod* elem=new nod;
elem->info=x;
if(p==NULL){
elem->urm=NULL;
return elem;
}
elem->urm=p;
return elem;
}
void sterge(nod* predecesor){
nod* deSters=predecesor->urm;
predecesor->urm=predecesor->urm->urm;
delete deSters;
}
int main(){
f>>n>>m;
int i,j;
while(f>>i>>j){
v[i]++;
v[j]++;
G[i]=inserare_inceput(G[i],j);
G[j]=inserare_inceput(G[j],i);
}
for(i=1;i<=n;i++)
if(v[i]%2!=0){
g<<-1<<'\n';
return 0;
}
st[++k]=1;
nod* parcurg;
while(k){
int nod=st[k];
if(v[nod]==0){
++muchii;
g<<nod<<' ';
st[k]=0;
k--;
if(muchii>=m)
break;
}
else{
int u;
if(v[nod]>=2){
v[nod]--;
parcurg=G[nod];
while(parcurg->urm->urm)
parcurg=parcurg->urm;
u=parcurg->urm->info;
st[++k]=u;
sterge(parcurg);
if(v[u]>=2){
parcurg=G[u];
if(parcurg->info==nod){
G[u]=G[u]->urm;
delete parcurg;
}else{
while(parcurg->urm->info!=nod)
parcurg=parcurg->urm;
sterge(parcurg);
}
}else if(v[u]==1){
delete G[u];
}
v[u]--;
}
else if(v[nod]==1){
v[nod]--;
u=G[nod]->info;
st[++k]=u;
delete G[nod];
if(v[u]>=2){
parcurg=G[u];
if(parcurg->info==nod){
G[u]=G[u]->urm;
delete parcurg;
}else{
while(parcurg->urm->info!=nod)
parcurg=parcurg->urm;
sterge(parcurg);
}
}else if(v[u]==1){
delete G[u];
}
v[u]--;
}
}
}
return 0;
}