Cod sursa(job #1180565)
Utilizator | Data | 30 aprilie 2014 19:14:41 | |
---|---|---|---|
Problema | Ciclu Eulerian | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 4.58 kb |
#include <fstream>
using namespace std;
struct cel
{
int nrm;
cel *adr;
};
typedef cel *lda1;
lda1 lda[100005];
int mc[500005][2],n,m,t,lista[500005],parc[100005],sol[500005],sters[500005],nrnod[100005];
bool e_conex()
{
int init=1,ultim=1;
lista[1]=1;
while (init<=ultim)
{
for (lda1 p=lda[lista[init]];p!=NULL;p=p->adr)
{
if (mc[p->nrm][0]==lista[init])
{
if (parc[mc[p->nrm][1]]==0) { parc[mc[p->nrm][1]]=1; ++ultim; lista[ultim]=mc[p->nrm][1]; }
}else
{
if (parc[mc[p->nrm][0]]==0) { parc[mc[p->nrm][0]]=1; ++ultim; lista[ultim]=mc[p->nrm][0]; }
}
}
++init;
}
for (int i=1;i<=n;++i) if (parc[i]==0) return false;
return true;
}
int main()
{
ifstream in ("ciclueuler.in");
ofstream out ("ciclueuler.out");
in>>n>>m;
for (int i=0;i<=n;++i)
{
nrnod[i]=0;
parc[i]=0;
lda1 p=lda[i],v;
while (p!=NULL)
{
v=p;
p=p->adr;
delete(v);
}
lda[i]=p;
}
for (int i=0;i<=m+3;++i)
{
mc[i][0]=0;
mc[i][1]=0;
lista[i]=0;
sol[i]=0;
sters[i]=0;
}
for (int i=1;i<=m;++i)
{
in>>mc[i][0]>>mc[i][1];
nrnod[mc[i][0]]++;
nrnod[mc[i][1]]++;
lda1 p=new cel;
p->nrm=i;
p->adr=lda[mc[i][0]];
lda[mc[i][0]]=p;
p=new cel;
p->nrm=i;
p->adr=lda[mc[i][1]];
lda[mc[i][1]]=p;
}
bool adr=e_conex();
if (adr)
{
int v1=0,pos1=0,pos2=0;
for (int i=1;i<=n;++i)
{
if (nrnod[i]&1==1)
{
++v1;
if (v1==1) pos1=i;
if (v1==2) pos2=i;
}
}
if (v1==0)
{
if (v1==2)
{
nrnod[pos1]++;
nrnod[pos2]++;
m++;
mc[m][0]=pos1;
mc[m][1]=pos2;
lda1 p=new cel;
p->nrm=m;
p->adr=lda[mc[m][0]];
lda[mc[m][0]]=p;
p=new cel;
p->nrm=m;
p->adr=lda[mc[m][1]];
lda[mc[m][1]]=p;
}
int init=1,ultim=1; lista[1]=1; sol[0]=0;
while (init>0)
{
if (nrnod[lista[init]]==0)
{
++sol[0];
sol[sol[0]]=lista[init];
init--;
}else
{
lda1 p=lda[lista[init]];
while (sters[p->nrm]==1) p=p->adr;
sters[p->nrm]=1;
if (mc[p->nrm][0]==lista[init])
{
++init;
lista[init]=mc[p->nrm][1];
nrnod[mc[p->nrm][1]]--;
nrnod[mc[p->nrm][0]]--;
}else
{
++init;
lista[init]=mc[p->nrm][0];
nrnod[mc[p->nrm][1]]--;
nrnod[mc[p->nrm][0]]--;
}
}
}
int ruptura=0;
for (int i=1;i<sol[0];++i)
{
if (pos1==sol[i])
{
if (pos2==sol[i+1])
{
ruptura=i;
}
}
if (pos2==sol[i])
{
if (pos1==sol[i+1])
{
ruptura=i;
}
}
}
for (int i=ruptura+1;i<sol[0];++i) out<<sol[i]<<" ";
for (int i=2;i<=ruptura;++i) out<<sol[i]<<" ";
out<<"\n";
}else out<<"-1";
}else out<<"-1";
in.close();
out.close();
return 0;
}