Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1520 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] parcours en largeur \ profondeur

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] parcours en largeur \ profondeur

n°2269397
alakaab
Posté le 09-11-2015 à 18:48:06  profilanswer
 

Bonjour ,  
 
je suis un debutant en C et je suis entrain de faire un exercice sur les BFS et DFS mais j´ai quelque soucis avec .. bon voila l´exercice en question :  
 
 
Your program shall read in a graph in adjacency list format and perform a breadth first search (BFS) on the graph, starting at the node first read. Each node's name is a single letter 'A'-'Z', so you can safely assume less than 27 nodes for your graph. The format of each line to be read in is specified as
  <
nodeName>-<string of neighboring node names>\n   (see example below).
 
The requested output  of your program is one line of node names followed by '\n', in which the order of names represents one possible exploration following breadth first search.
 
Note (1): for most inputs several different outputs are possible. Here we only ask you to find one of them!
Note (2): all graphs here are undirected, i.e. if a connection A-...B... exists you will also find a connection B-...A....
 
 inputs et output doivent etre comme ca : http://hpics.li/94c1e3a  
 
 
 
 
y´a un truc que je comprend pas  .... vu qu´on me donne pas le nombre des chaines de caractere comment suis je censé faire une liste d´adjacence ?  
 
 
 
 
sinon voila le code que j´ai fait pour la creer la liste d´adjacence en me basant sur un exple  ;  
 

Code :
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct node
  5. {
  6.     struct node *next;
  7.     char vertex;
  8.    
  9. }node;
  10. char s[27]; 
  11. //heads of linked list
  12. node *G[20]; 
  13. //insert an edge (vi,vj) in te adjacency list
  14. void insert(int,char[],int);
  15. void BFS(int,int) ;
  16. int main()
  17. {
  18.     int i,n; int v=0;
  19.  
  20.     //initialise G[] with a null
  21.  
  22.     for(i=0;i<=27;i++)
  23.     {
  24.         G[i]=NULL;
  25.     }
  26.    
  27.          scanf("%s",s);
  28.            
  29.              n=strlen(s);
  30.              insert(v,s,n);
  31.              v=v+1;
  32.          
  33.          return 0;
  34. }
  35. void insert(int vi,char s[],int n)
  36. {
  37.     node *p,*q,*d; int i=2 ;
  38.    
  39.     //acquire memory for the new node
  40.     q=(node*)malloc(sizeof(node));
  41.     q->vertex=s[0];
  42.    
  43.     q->next=NULL;
  44.  
  45.     //insert the node in the linked list number vi
  46.     if(G[vi]==NULL)
  47.        {
  48.           G[vi]=q;
  49.        }
  50.    
  51.     while (i<n){
  52.         d=(node*)malloc(sizeof(node));
  53.     d->vertex=s[i];
  54.     d->next=NULL;
  55.    
  56.         p=G[vi];
  57.      
  58.         while(p->next!=NULL)
  59.             p=p->next;
  60.         p->next=d;
  61.         i++;
  62.       }
  63.      
  64.     }


 
 
 
Je sais pas c´est tres claire mais bon je suis un peu confus c´est pour ca  
 
Merci


Message édité par gilou le 09-11-2015 à 21:30:00
mood
Publicité
Posté le 09-11-2015 à 18:48:06  profilanswer
 

n°2269399
gilou
Modérateur
Modzilla
Posté le 09-11-2015 à 22:09:37  profilanswer
 

Tu n'as pas besoin de te fatiguer a implémenter le graphe en mémoire de manière complexe juste pour répondre à la question:
En supposant ton graphe connexe (et je suppose que ça suffit pour ton exercice)
Tu as juste besoin de calculer la distance minimale de chaque sommet au sommet de base.
A toi de trouver une manière simple de procéder.
 
A+,
 
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2269437
alakaab
Posté le 10-11-2015 à 16:26:37  profilanswer
 

Merci pour la reponse ! mais est ce que c´est possible de realiser un BFS a partir du code que j´ai fait ?

n°2269507
gilou
Modérateur
Modzilla
Posté le 11-11-2015 à 19:56:42  profilanswer
 

Je ne sais pas, puisque tu ne montre pas comment tu veux calculer le BFS.
En tout cas, je te souhaite du plaisir a gérer les allocations.
J'ai pondu vite fait une soluce à ton exercice:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // On représente le graphe par sa structure en liste d'adjacence
  5. // Comme donné dans le fichier, on n'a pas besoin de plus
  6. #define MAXNODES 26
  7. char Graphe[MAXNODES][MAXNODES+2] = {0};
  8. // Associe a chaque lettre le sommet correspondant dans Graphe, s'il existe
  9. char Index[MAXNODES];
  10. // Lecture et remplissage des structures
  11. int read_graph(const char *path) {
  12.     FILE *fp;
  13.     if ((fp = fopen(path, "r" )) == NULL) {
  14.         fprintf(stderr, "Error: Cannot open file %s\n", path);
  15.         return EXIT_FAILURE;
  16.     }
  17.     int i;
  18.     for (i = 0; i < MAXNODES; ++i) {
  19.         Index[i] = -1;
  20.     }
  21.     i = 0;
  22.     char line[MAXNODES+3];
  23.     while((fgets(line, MAXNODES+3, fp)) != NULL) {
  24.         char buffer[MAXNODES + 2] = {0};
  25.         if (sscanf(line, "%1[A-Z]-%[A-Z]\n", buffer, buffer+2)) {
  26.             buffer[1] = '-';
  27.             strncpy(Graphe[i], buffer, MAXNODES+2);
  28.             Index[*Graphe[i] - 'A'] = i;
  29.             i++;
  30.         }
  31.         else if (sscanf(line, "%1[A-Z]\n", buffer)) {
  32.             buffer[1] = '-';
  33.             buffer[2] = 0;
  34.             strncpy(Graphe[i], buffer, MAXNODES+2);
  35.             Index[*Graphe[i] - 'A'] = i;
  36.             i++;
  37.         }
  38.     }
  39.     fclose(fp);
  40.     return EXIT_SUCCESS;
  41. }
  42. // calcul du BFS
  43. void BFS() {
  44.     char bfs[MAXNODES*2] = {0};
  45.     int i = 0;
  46.     int current = 0;
  47.     int last = 0;
  48.     // On cherche des noeuds du graphe pas traités
  49.     while (*Graphe[i]) {
  50.         // un nouveau sommet début de graphe
  51.         // pour une composante connexe
  52.         if (Graphe[i][1] == '-') {
  53.             Graphe[i][1] = '+';
  54.             if (last != 0) {
  55.                 bfs[last++] = ' ';
  56.             }
  57.             current = last;
  58.             bfs[last++] = *Graphe[i];
  59.             do {
  60.                 int j = 2;
  61.                 char c;
  62.                 // On traite les noeuds adjacent au noeud courant
  63.                 // en les ajoutant à bfs s'ils n'y sont pas déjà
  64.                 while ((c = Graphe[Index[bfs[current] - 'A']][j])) {
  65.                     if (Graphe[Index[c - 'A']][1] == '-') {
  66.                         Graphe[Index[c - 'A']][1] = '+';
  67.                         bfs[last++] = c;
  68.                     }
  69.                     ++j;
  70.                 }
  71.             } while(bfs[current++]); // et on avance d'un cran dans bfs
  72.         }
  73.         ++i;
  74.     }
  75.     printf("%s\n", bfs);
  76. }
  77. int main() {
  78.     if (read_graph("bfs.txt" ) == EXIT_SUCCESS) {
  79.         BFS();
  80.     }
  81.     return 0;
  82. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2269508
gilou
Modérateur
Modzilla
Posté le 11-11-2015 à 19:59:25  profilanswer
 

Note:
J'ai supposé que les données en input seront toujours valide, ce qui hors du contexte d'un exo, et dans la vie réelle, a toute les chances de se révéler faux :D
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] parcours en largeur \ profondeur

 

Sujets relatifs
Decryptage C++[C++11] fonction renvoyant une reference sur un tableau de 10 string
Programmation C - conditionnelle[HTML5/CSS] Menu sur toute la largeur du site
C tri par fusion[C#] Découpage de chaine
aligner verticalement colonne en CBesoin d'aide en C
[C#] Problème récup fabrique de la classe COM 
Plus de sujets relatifs à : [C] parcours en largeur \ profondeur


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR