[C] parcours en largeur \ profondeur

parcours en largeur \ profondeur [C] - C - Programmation

Marsh Posté le 09-11-2015 à 18:48:06    

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
Reply

Marsh Posté le 09-11-2015 à 18:48:06   

Reply

Marsh Posté le 09-11-2015 à 22:09:37    

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é!  --
Reply

Marsh Posté le 10-11-2015 à 16:26:37    

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

Reply

Marsh Posté le 11-11-2015 à 19:56:42    

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é!  --
Reply

Marsh Posté le 11-11-2015 à 19:59:25    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed