Cod sursa(job #184957)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 24 aprilie 2008 16:37:55
Problema Dusman Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#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;
}