Pagini recente » Borderou de evaluare (job #1567425) | Cod sursa (job #2796621) | Cod sursa (job #383950) | Cod sursa (job #1523106) | Cod sursa (job #1485671)
#include <iostream>
#include <fstream>
#include <queue>
#define fin "ciclueuler.in"
#define fou "ciclueuler.out"
using namespace std;
ifstream t1(fin);
ofstream t2(fou);
int n,rel,x[30][30],grade[30],okpar,pus[30],viz[100],gradtot,stiva[100],rez[100],marime;
int iseulerian()
{
queue <int> c;
int nrvf=0,vf,i;
c.push(1); nrvf=1; pus[1]=1;
while(!c.empty())
{
vf=c.front(); c.pop();
for(i=1;i<=n;i++)
if(x[i][vf]==1 && pus[i]==0)
{
pus[i]=1;
c.push(i);
nrvf++;
}
}
if(okpar==1 && nrvf==n) return 1;
else return 0;
}
int ciclu(int pornire)
{
int i,j,nrstiva=1,vfcrt,poz=1,vf=0,vfprec=0;
for(i=1;i<=n;i++) viz[i]=0;
viz[pornire]=1;
stiva[1]=pornire;
vfprec=pornire;
while(vf!=pornire)
{
vfcrt=stiva[poz]; grade[vfcrt]--; vf=0; gradtot--;
for(i=1;i<=n;i++)
if(x[i][vfcrt]==1 && grade[i]>0 && i!=vfprec) { vf=i; break; }
if(vf!=0) {viz[vf]=1; stiva[++poz]=vf; grade[vf]--; gradtot--; }
else break;
vfprec=vfcrt;
}
return poz;
}
int main()
{
int i,j,lin,col,vfbun,nr,pozinser=0;
t1>>n>>rel;
for(i=1;i<=rel;i++)
{
t1>>lin>>col;
x[lin][col]=1; x[col][lin]=1;
}
int grad;
okpar=1;
for(i=1;i<=n;i++)
{
grad=0;
for(j=1;j<=n;j++) if(x[i][j]==1) grad++;
grade[i]=grad;
gradtot+=grad;
if(grad%2==1) okpar=0;
}
cout<<okpar;
if(iseulerian()==0) t2<<-1<<'\n';
else
{
while(gradtot!=0)
{
for(i=1;i<=n;i++) if(grade[i]>0) { vfbun=i; break; }
nr=ciclu(vfbun);
pozinser=0;
for(i=1;i<=marime;i++) if(vfbun==rez[i]) pozinser=i;
if(pozinser==0)
{
marime+=nr;
for(i=1;i<=marime;i++) rez[i]=stiva[i];
}else
if(pozinser==marime)
{
for(i=2;i<=nr;i++) rez[marime+i-1]=stiva[i];
marime+=nr; marime--;
}
else
{
int elemplus=marime-pozinser;
for(i=1;i<=elemplus;i++)
{
rez[pozinser+i+nr-1]=rez[pozinser+i];
rez[pozinser+i]=stiva[i+1];
}
marime+=nr; marime--;
}
}
}
for(i=1;i<=marime;i++) t2<<rez[i]<<' '; t2<<'\n';
t1.close();
t2.close();
return 0;
}