Advertisement
frentzy

DFS

Jan 14th, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. // Algoritmul de parcurgere in adancime (DFS). Reprezentarea grafului se face cu matrice de adiacenta.
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. #define NMAX 100
  7.  
  8. char vecin[NMAX][NMAX]; // Matricea de adiacenta a grafului
  9.  
  10. char visit[NMAX];      // visit[k] = 1 daca nodul k a fost vizitat si 0 in caz contrar
  11.  
  12. int trace[NMAX];       // tablou ce pastreaza nodurile in ordinea in care sunt intalnite la parcurgerea in latime
  13. int kth;               // numarul de elemente vizitate
  14.  
  15.  
  16. void dfs(int n, short u) {
  17.   int v;
  18.  
  19.   visit[u] = 1;        // marcheaza nodul u ca fiind vizitat
  20.   trace[kth++] = u;    // adauga nodul u in tabloul ce contine lista nodurilor deja vizitate
  21.  
  22.   for (v = 0; v < n; v++) {       // pentru toate nodurile grafului
  23.     if ((vecin[u][v] == 1) && !visit[v]) {  // verifica daca u si v sunt vecine si daca v nu a fost vizitat
  24.       dfs(n, v);                  // apeleaza recursiv dfs pentru nodul v
  25.     }
  26.   }
  27. }
  28.  
  29.  
  30. int main() {
  31.   FILE *fin, *fout;
  32.   int n, m, u, v, i, start;
  33.  
  34.   fin = fopen("dfs.in", "r");
  35.   fout = fopen("dfs.out", "w");
  36.  
  37.   fscanf(fin, "%d %d %d", &n, &m, &start);
  38.   start--;
  39.  
  40.   for (i = 0; i < m; i++) {
  41.     fscanf(fin, "%d %d", &u, &v);  // citeste o pereche de noduri adiacente
  42.  
  43.     u--;                           // scade 1 din valorile nodurilor
  44.     v--;                           // transforma nodurile din intervalul 1...n in 0...(n-1)
  45.     vecin[u][v] = 1;               // marcheaza faptul ca u si v sunt adiacente
  46.     vecin[v][u] = 1;
  47.   }
  48.  
  49.   dfs(n, start);                   // porneste din start sa viziteze nodurile folosind strategia DFS
  50.  
  51.   for (i = 0; i < kth; i++) {      // afiseaza in ordine nodurile vizitate
  52.     fprintf(fout, "%d ", trace[i] + 1);
  53.   }
  54.      
  55.   fclose(fin);
  56.   fclose(fout);
  57.  
  58.   return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement