Advertisement
EduPsEudo

DFS em Lista de Adjacência em C

Jul 17th, 2022
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define true 1
  6. #define false 0
  7.  
  8. typedef int bool;
  9. typedef int TIPOPESO;
  10.  
  11. #define BRANCO 0
  12. #define AMARELO 1
  13. #define VERMELHO 2
  14.  
  15. typedef struct adjacencia {
  16.     int vertice;                // Vertice final da aresta.
  17.     int peso;
  18.     struct adjacencia *prox;
  19. } ADJACENCIA;
  20.  
  21. typedef struct vertice {
  22.     char cidade;
  23.     ADJACENCIA *cabeca;
  24. } VERTICE;
  25.  
  26. typedef struct grafo {
  27.     int vertices;
  28.     int arestas;
  29.     VERTICE *adj;
  30. } GRAFO;
  31.  
  32. GRAFO *criaGrafo(int numVertices)
  33. {
  34.     GRAFO *g = (GRAFO *) malloc(sizeof(GRAFO));
  35.  
  36.     g->vertices = numVertices;
  37.     g->arestas = 0;
  38.     g->adj = (VERTICE *) malloc(numVertices * sizeof(VERTICE));
  39.  
  40.     for (int i = 0; i < numVertices; i++) {
  41.         g->adj[i].cabeca = NULL;
  42.     }
  43.  
  44.     return g;
  45. }
  46.  
  47. ADJACENCIA *criaAdj(int noFinalAresta, int peso)        // Função auxiliar.
  48. {
  49.     ADJACENCIA *temp = (ADJACENCIA *) malloc(sizeof(ADJACENCIA));       // Cria espaço para um nó na lista de adjacencia.
  50.  
  51.     temp->vertice = noFinalAresta;
  52.     temp->peso = peso;
  53.     temp->prox = NULL;
  54.  
  55.     return temp;
  56. }
  57.  
  58. bool criaAresta(GRAFO *gr, int vi, int vf, int peso)
  59. {
  60.     if (!gr) return false;
  61.     if ((vf < 0) || (vi >= gr->vertices))
  62.         return false;
  63.        
  64.     if ((vi < 0) || (vf >= gr->vertices))
  65.         return false;
  66.  
  67.     ADJACENCIA *novo = criaAdj(vf, peso);
  68.     novo->prox = gr->adj[vi].cabeca;
  69.     gr->adj[vi].cabeca = novo;
  70.     gr->arestas++;
  71.  
  72.     return true;
  73. }
  74.  
  75. void imprime(GRAFO *gr)
  76. {
  77.     printf("Vertices: %d. Arestas: %d.\n", gr->vertices, gr->arestas);
  78.  
  79.     int i;
  80.     for (i = 0; i < gr->vertices; i++)
  81.     {
  82.         printf("Cidade %c | v%d: ", gr->adj[i].cidade, i);
  83.         ADJACENCIA *ad = gr->adj[i].cabeca;
  84.  
  85.         while(ad)
  86.         {
  87.             printf("v%d(%d) ", ad->vertice, ad->peso);
  88.  
  89.             ad = ad->prox;
  90.         }
  91.         printf("\n");
  92.     }
  93. }
  94. int visitaP(GRAFO *g, int u, int *cor, char cidade)
  95. {
  96.     cor[u] = AMARELO;
  97.  
  98.     if (g->adj[u].cidade == cidade)
  99.     {
  100.         return u;
  101.     }
  102.  
  103.     ADJACENCIA *v = g->adj[u].cabeca;
  104.  
  105.     while(v)
  106.     {
  107.         if (cor[v->vertice] == BRANCO)
  108.         {
  109.             int res = visitaP(g, v->vertice, cor, cidade);
  110.             if (res != -1) return res;
  111.         }
  112.         v = v->prox;
  113.     }
  114.     cor[u] = VERMELHO;
  115.  
  116.     return -1;
  117. }
  118.  
  119. int profundidade(GRAFO *g, char cidade)
  120. {
  121.     int numVertices = g->vertices;
  122.     int cor[numVertices];
  123.  
  124.     int u;
  125.     for (u = 0; u < numVertices; u++)
  126.     {
  127.         cor[u] = BRANCO;
  128.     }
  129.  
  130.     for (u = 0; u < numVertices; u++)
  131.     {
  132.         if (cor[u] == BRANCO)
  133.         {
  134.             int resultado = visitaP(g, u, cor, cidade);
  135.             if (resultado != -1) return resultado;
  136.         }
  137.     }
  138.     return -1;
  139. }
  140.  
  141. bool atribuiValor(GRAFO *gr, int no, char cidade)
  142. {
  143.     if (!gr) return false;
  144.  
  145.     if ((no < 0) || (no >= gr->vertices))
  146.         return false;
  147.  
  148.     if (profundidade(gr, cidade) == -1)
  149.     {
  150.         gr->adj[no].cidade = cidade;
  151.         return true;
  152.     }    
  153. }
  154.  
  155. int main()
  156. {
  157.     GRAFO *meuGrafo = criaGrafo(5);
  158.  
  159.     atribuiValor(meuGrafo, 0, 'A');
  160.     atribuiValor(meuGrafo, 1, 'B');
  161.     atribuiValor(meuGrafo, 2, 'C');
  162.     atribuiValor(meuGrafo, 3, 'D');
  163.     atribuiValor(meuGrafo, 4, 'E');
  164.  
  165.     criaAresta(meuGrafo, 0, 1, 2);
  166.     criaAresta(meuGrafo, 1, 2, 4);
  167.     criaAresta(meuGrafo, 2, 0, 12);
  168.     criaAresta(meuGrafo, 2, 4, 40);
  169.     criaAresta(meuGrafo, 3, 1, 3);
  170.     criaAresta(meuGrafo, 4, 3, 8);
  171.  
  172.     imprime(meuGrafo);
  173.  
  174.     int posC = profundidade(meuGrafo, 'X');
  175.  
  176.     printf("Posicao de X: %d\n", posC);
  177.  
  178.     return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement