Pagini recente » Cod sursa (job #97782) | Cod sursa (job #676168) | Cod sursa (job #704567) | Cod sursa (job #184957)
Cod sursa(job #184957)
#include<stdio.h>
#include<stdlib.h>
FILE*fin=fopen("dusman.in","r");
FILE*fout=fopen("dusman.out","w");
struct nod1{int inf;nod1 *urm;};
struct nod2{int inf;nod2 *ant;nod2 *urm;};
nod1 *vec[1001],*p;
nod2 *prim;
int nrp=0,n,m,k,a,b,sol[1001];
int ok(int pas)
{
a=sol[pas];
b=sol[pas-1];
p=vec[a];
while(p)
{
if(p->inf==b) return 0;
p=p->urm;
}
return 1;
}
void extrage(nod2 *l)
{
if(l->ant) l->ant->urm=l->urm;
else prim=l->urm;
if(l->urm) l->urm->ant=l->ant;
}
void ref(nod2 *l)
{
if(l->ant) l->ant->urm=l;
else prim=l;
if(l->urm) l->urm->ant=l;
}
void back(int pas)
{
nod2 *kl;
int j;
kl=prim;
while(kl)
{
extrage(kl);
sol[pas]=kl->inf;
if(ok(pas)) if(pas==n)
{
nrp++;
if(nrp==k)
{
for(j=1;j<=n;j++)
fprintf(fout,"%d%c",sol[j],' ');
fclose(fout);
exit(0);
}
}else back(pas+1);
ref(kl);
kl=kl->urm;
}
}
int main()
{
nod2 *last,*q;
int i;
fscanf(fin,"%d%d%d",&n,&k,&m);
for(i=1;i<=n;i++)
vec[i]=NULL;
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d",&a,&b);
p=new nod1;
p->inf=b;
p->urm=vec[a];
vec[a]=p;
p=new nod1;
p->inf=a;
p->urm=vec[b];
vec[b]=p;
}
//creare lista dublu inlantuita
prim=new nod2;
prim->inf=1;
prim->ant=NULL;
prim->urm=NULL;
last=prim;
for(i=2;i<=n;i++)
{
q=new nod2;
q->ant=last;
q->inf=i;
q->urm=NULL;
last->urm=q;
last=q;
}
fclose(fin);
sol[0]=0;
back(1);
return 0;
}