예제 #1
0
파일: C10.c 프로젝트: gv2vi/DrumPack
void 
ecrireGraph (char *nom, int k)
{
  FILE *descFic = NULL;
 
  ouvrirFichier (nom, &descFic, "w");
  ecrireEnTete (descFic, "p cnf ", k);
  

for(int x=1; x<=nb_sommet(); x++)
	{		fprintf(descFic, " %d ", x );
				
			for(int y=0; y<=nb_sommet(); y++)
			{
				if( (est_adjacent(x,y)==1) )
				{
					fprintf(descFic, " %d ", y);
				}
						
			}
			
			fprintf(descFic, " 0\n");
	       }

  fclose (descFic);
}
예제 #2
0
void generateur_de_clause(int k){
  int nb_var= nb_sommet() * k;
  int nb_clause=0;
  
  //première ligne du fichier de glucose
  fprintf(fichier,"%s %s %d %s\n","p","cnf",nb_var,"              ");
  
  //chaque_position au moins un sommet
  for(int j= 1 ; j<=k ; j++) {
    for(int i = 0; i<nb_sommet()*k; i=i+k){    
      fprintf(fichier,"%d ",i+j);
    }
    fprintf(fichier,"0 \n");
    nb_clause++;
  }

  //au moins une extrêmité par arrête
  for(int i=1; i<=nb_sommet(); i++) {
    for(int j=1; j<=nb_sommet(); j++){

      if(est_adjacent(i,j)){
	for(int t=0;t<k*nb_sommet();t=t+nb_sommet()){
	  fprintf(fichier,"%d %d ",i+t,j+t);
	}
	fprintf(fichier,"0\n");
	nb_clause++;
      }
  
      //pas deux sommets différents a la même position
      for(int j= 1 ; j<=nb_sommet()*k ; j=j+nb_sommet()) {
	for(int t=j; t<=j+nb_sommet()-1; t++){
	  for(int i=t+1; i<=j+nb_sommet()-1; i++){
	    fprintf(fichier,"-%d -%d 0\n",t,i);
	    nb_clause++;
	  }
	}
      }
  
    }
  }
  

  //remplissage de l'entête du fichier input de glucose
  fseek(fichier, 0, SEEK_SET);
  fprintf(fichier,"%s %s %d %d","p","cnf",nb_var,nb_clause);
  
}