Exemple #1
0
//
// paramètres :
//
// graphe = graphe orienté
// s = sommet de départ
// result = tableau de sommets à une distance inférieure ou égale à 2 du sommet s (result[i]=1 si distance(s,i)<=2, -1 sinon)
//
void distance_inf_2(tGraphe graphe, tNumeroSommet s, int result[])
{

  // nombre de sommets du graphe
  unsigned int n = grapheNbSommets(graphe);
  int nSuccesseur_de_s = grapheNbSuccesseursSommet(graphe,s);
  int nSuccesseur_de_y;
  tNumeroSommet x, y;
  tNumeroSommet tab[n];

  // variable de parcours
  unsigned int i;

  /* Pour eviter des erreurs */
  for(i =0; i< n; i++){
    tab[n] =-1;
  }
    /* boucle principale */
  for (i=0; i<nSuccesseur_de_s; i++){
    // y est le nom du successeur courant
    x = grapheSuccesseurSommetNumero(graphe, x, i);
    tab[x] = 1;
    result[x] = 1;
    nSuccesseur_de_y = grapheNbSuccesseursSommet(graphe,x);
    for(int j =0; j< nSuccesseur_de_y; j++){
      y = grapheSuccesseurSommetNumero(graphe, x, i);
      //Si on ne la pas deja traité
      if(tab[y] == -1){
        tab[y] = 1;
        result[y] = 2;
      }
    }
  }
}
Exemple #2
0
//
// paramètres :
//
// graphe = graphe orienté
// s = sommet de départ
// result = tableau de sommets accessibles depuis s (result[i]=1 si i est accessible depuis s, -1 sinon)
//
void parcours_largeur(tGraphe graphe, tNumeroSommet s, int result[])
{
  // nombre de sommets du graphe
  unsigned int n = grapheNbSommets(graphe);
  // le tableau de couleurs
  tCouleur tabCouleurs[n];
  // la file
  tFileSommets file;
  // sommets x,y
  tNumeroSommet x, y;
  // variable de parcours
  unsigned int i;

  /* initialisation */

  // colorier tous les sommets en bleu
  for (i=0; i<n; i++)
    {
      tabCouleurs[i] = BLEU;
    }
  // initialiser la file
  file = fileSommetsAlloue();
  // colorier s en vert
  tabCouleurs[s] = VERT;
  // enfiler s
  fileSommetsEnfile(file, s);

  /* boucle principale */

  // tant que la file n'est pas vide
  while (!fileSommetsEstVide(file))
    {
      // x = tête de file
      x = fileSommetsDefile(file);
      // parcours de tous les successeurs
      for (i=0; i<grapheNbSuccesseursSommet(graphe,x); i++)
        {
	  // y est le nom du successeur courant
	  y = grapheSuccesseurSommetNumero(graphe, x, i);
	  if (tabCouleurs[y] == BLEU)
            {
	      // colorier y en vert et l’enfiler
	      tabCouleurs[y] = VERT;
	      fileSommetsEnfile(file, y);
	    }
        }
      tabCouleurs[x] = ROUGE;
    }

  // libérer la file
  fileSommetsLibere(file);

  // tous les sommets en rouge sont accessibles
  for (i=0; i<n; i++)
    {
      if (tabCouleurs[i] == ROUGE) result[i] = 1;
      else result[i] = -1;
    }
}
/*
* Boucle principal
*/
void traitement_pile(tPileSommets pile, tNumeroSommet xSommet, int i[MAX_SOMMETS], tGraphe graphe, tTabCouleurs couleurs){
  tNumeroSommet iSucc;
    tNomSommet nomSommet;
      tNomSommet nomSommet2;
  int trouver = 0;
  int nSucc =0;
  int j =0;
  i[xSommet] = i[xSommet] + 1;
  nSucc = grapheNbSuccesseursSommet(graphe, xSommet);
  while(i[xSommet] <= nSucc && trouver == 0){
    iSucc = grapheSuccesseurSommetNumero(graphe, xSommet, j);
      grapheRecupNomSommet(graphe, iSucc, nomSommet);
      grapheRecupNomSommet(graphe, xSommet, nomSommet2);
    printf("sommet x %s\n", nomSommet2);
      printf("succ du sommet x %s\n", nomSommet);
    printf("sommet %d\n", i[xSommet]);
    printf("couleur i %d\n",couleurs[iSucc] );
    printf("BLEU = %d\n", BLEU);
    printf("-----------------------------\n");
    if(couleurs[iSucc] == BLEU){
      trouver = 1;
    }
    else{
      i[xSommet] = i[xSommet] +1;
      j++;
    }
  }
  if(trouver == 1){
    couleurs[iSucc] = VERT;
    printf("empile \n");
    pileSommetsEmpile(pile, iSucc);
  }
  else{
    couleurs[xSommet] = ROUGE;
    printf("depile \n");
    pileSommetsDepile(pile);
  }
}
void parcourLarg(tGraphe graphe, tNomSommet som) 
{
	int nb_sommets;
	tNumeroSommet current;
	//tNomSommet destination;

	nb_sommets = grapheNbSommets(graphe); 
	numerosParcourus = (tNumeroSommet*)malloc(nb_sommets*sizeof(tNumeroSommet));
	numerosEnfiles = (tNumeroSommet*)malloc(nb_sommets*sizeof(tNumeroSommet));
	
	current = grapheChercheSommetParNom(graphe, som);
	enfiler(current);
	
	while(!fileEstVide()){
		int i, nb_successeurs;
		tNomSommet sommet;
		current = numerosEnfiles[enfilesIndex++];
		grapheRecupNomSommet (graphe, current, sommet);
		printf(" %s ",sommet);
		if (grapheEstOriente(graphe))
		{
			nb_successeurs = grapheNbSuccesseursSommet(graphe,current);
			for ( i = 0 ; i <  nb_successeurs ; i++ ){
				enfiler(grapheSuccesseurSommetNumero(graphe,current,i));
			}
		}
		else
		{
			nb_successeurs = grapheNbVoisinsSommet(graphe,current);
			for ( i = 0 ; i <  nb_successeurs ; i++ ){
				enfiler(grapheVoisinSommetNumero(graphe,current,i));
			}
		}
	}
	printf("\n");
	free(numerosParcourus);
	free(numerosEnfiles);
}
Exemple #5
0
/* Affichage */
void grapheAffiche(tGraphe graphe) {
  tNomSommet nom;
  tNumeroSommet i, j, successeur, predecesseur;
  tValeurArc val;
  tArc arc;
  /* Affiche la liste des sommets et leur nom */
  printf("Type de l'arbre : ");
  if (grapheEstOriente(graphe))  printf("orientee"); 
  else printf("non orientee");
  printf("\n\n");

  printf("Nombre de sommets : %d\n\n", grapheNbSommets(graphe));

  printf("Liste des sommets avec leurs numeros:\n");
  for(i=0; i < grapheNbSommets(graphe);i++) {
    grapheRecupNomSommet(graphe, i, nom);
    printf("- %d : %s\n", i, nom);
  }
  printf("\n");

  /* Matrice d'adjacence */
  printf("Matrice d'adjacence :\n");
  printf("%2s", "");
  for(i=0; i < grapheNbSommets(graphe);i++) {
    printf("%7d", i);
  }
  printf("\n");
  
  for(i=0; i < grapheNbSommets(graphe);i++) {
    printf("%3d ", i);
    for(j=0; j < grapheNbSommets(graphe);j++) {
      if (grapheExisteArcEntre(graphe,i,j)) {
	val = grapheRecupValeurArc(graphe,i,j);
	printf("%6.2f ", val);}
      else
	printf("       ");
    }
    printf("\n");
  }
  printf("\n");

  /* Affiche les voisins, successeurs, prédecesseurs */
  if (grapheEstOriente(graphe)) {
    /* affichage des successeurs */
    printf("Liste des successeurs :\n");
    for(i=0; i < grapheNbSommets(graphe);i++) {
      grapheRecupNomSommet(graphe, i, nom);
      printf("%s : ", nom);
      for(j=0; j<grapheNbSuccesseursSommet(graphe, i); j++) {
	successeur = grapheSuccesseurSommetNumero(graphe, i, j);
	grapheRecupNomSommet(graphe, successeur, nom);
	printf("%s=%.2f ", nom, 
	       grapheRecupValeurArc(graphe, i, successeur));
      }
      printf("\n");
    }
    /* affichage des prédécesseurs */
    printf("\nListe des predecesseurs :\n");
    for(i=0; i < grapheNbSommets(graphe);i++) {
      grapheRecupNomSommet(graphe, i, nom);
      printf("%s : ", nom);
      for(j=0; j<grapheNbPredecesseursSommet(graphe, i); j++) {
	predecesseur = graphePredecesseurSommetNumero(graphe, i, j);
	grapheRecupNomSommet(graphe, predecesseur, nom);
	printf("%s=%.2f ", nom, 
	       grapheRecupValeurArc(graphe, predecesseur, i));
      }
      printf("\n");
    }

  } else {
    /* le graphe n'est pas orienté */
    printf("Liste des voisins :\n");
    for(i=0; i < grapheNbSommets(graphe);i++) {
      grapheRecupNomSommet(graphe, i, nom);
      printf("%s : ", nom);
      for(j=0; j<grapheNbVoisinsSommet(graphe, i); j++) {
	successeur = grapheVoisinSommetNumero(graphe, i, j);
	grapheRecupNomSommet(graphe, successeur, nom);
	printf("%s=%.2f ", nom, 
	       grapheRecupValeurArc(graphe, i, successeur));
      }
      printf("\n");
    }
  }
  printf("\n");
  
/* Affiche la liste des arcs */
  printf("Liste des arcs :\n");
  for(i=0; i < grapheNbArcs(graphe); i++) {
    arc = grapheRecupArcNumero(graphe, i);
    grapheRecupNomSommet(graphe, arc.orig, nom);
    printf("%s", nom);
    if (grapheEstOriente(graphe))
      printf(" -> ");
    else
      printf(" -- ");
    grapheRecupNomSommet(graphe, arc.dest, nom);
    printf("%s ",nom);
    printf("  = %.2f\n", arc.val);
  }
  
}
void graphe2visu (tGraphe graphe, char* outfile) 
{
	FILE *fic; /* le fichier .dot dan lequel on va ecrire*/
	char commande[80]; /* la commande appeller par sprintf plus bas */
	char dotfile[80]; /* le fichier dot pour creer le ps */
	
	int nb_sommet, i, j, nb_successeur, ret;
	tNomSommet origine;
	tNomSommet destination;
	
	/* on va creer un fichier pour graphviz, dans le fichier "outfile".dot */
	strcpy(dotfile, outfile);
	strcat(dotfile, ".dot");
	
	/* on ouvre le fichier .dot en ecriture */
	fic = fopen(dotfile, "w");

	if (fic==NULL) 
		halt("Ouverture du fichier %s en ecriture impossible\n", dotfile);

	/* on recupere le nombre de sommet du graphe*/
	nb_sommet = grapheNbSommets(graphe); 
	
	
	if (grapheEstOriente(graphe))
	{
		fprintf(fic, "digraph {\n"); /* digraph pour oriente */
		for (i=0; i<nb_sommet;i++)
		{
			/* on recupere le nb de successeur du sommet*/
			nb_successeur = grapheNbSuccesseursSommet(graphe,i);
			for (j=0;j<nb_successeur;j++)
			{
				/* on recupere le nom du sommet i et on le stock dans la variable origine */
				grapheRecupNomSommet(graphe,i,origine);
				/* on recupere le nom du successeur j du sommet i et on le stock dans la variable destination*/
				grapheRecupNomSommet(graphe,grapheSuccesseurSommetNumero(graphe,i,j),destination);
				/* -> pour oriente*/
				fprintf(fic, "\t%s -> %s;\n", origine, destination);
			}
		}
		fprintf(fic, "}");
	}
	else
	{
		fprintf(fic, "graph {\n"); /* graph pour non oriente */
		for (i=0; i<nb_sommet;i++)
		{
			/* on recupere le nb de voisin du sommet*/
			nb_successeur = grapheNbVoisinsSommet(graphe,i);
			for (j=0;j<nb_successeur;j++)
			{
				/* on recupere le nom du sommet i et on le stock dans la variable origine */
				grapheRecupNomSommet(graphe,i,origine);
				/* on recupere le nom du voisin j du sommet i et on le stock dans la variable destination*/
				grapheRecupNomSommet(graphe,grapheVoisinSommetNumero(graphe,i,j),destination);
				
				/* -- pour non oriente*/
				if (strcmp(origine, destination) < 0)
					fprintf(fic, "\t%s -- %s;\n", origine, destination);
			}
		}
		fprintf(fic, "}");
	}
	
	fclose(fic);
	
	/* on stock dans commande la commande qui permet a partir d'un .dot de creer un .ps*/
	sprintf(commande, "dot -Tps %s -o %s.ps", dotfile, outfile);
	/* on appelle la fonction stocker dans commande */
	ret = system(commande);
	
	if (WEXITSTATUS(ret)) 
		halt("La commande suivante a echoue \n%s\n", commande);
}