Código de busca em profundidade em grafos

Como solicitado, segue o código que a turma de 2015.2 desenvolveu em sala de aula para o algoritmo de DFS.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int v, a;
int *pai;
int *dist;
int *vist;

int **leitura(int &v, int &a)
{
    int orig, dest, peso;
    int **G;

    // Obtém número de vértices e arestas
    scanf("%d", &v);
    scanf("%d", &a);

    // Declara a matriz de adjacências
    G = (int **)malloc(sizeof(int) * v * v);
    for (int i = 0; i < v; i++)
        G[i] = (int *)malloc(sizeof(int) * v);

    // Obtém os dados de cada aresta
    for (int i = 0; i < a; i++)
    {
        scanf("%d %d %d", &orig, &dest, &peso);
        G[orig][dest] = G[dest][orig] = peso;
    }

    return G;
}

void percorrer(int dest)
{
    printf("%d",dest);
    if(pai[dest] != -1)
    {
        printf("<-");
        percorrer(pai[dest]);
    }
}

void dfs(int orig, int **G)
{
    vist[orig] = 1;
    for(int i = 0; i < v; i++)
    {
        if(G[orig][i] != 0 && vist[i] != 1)
        {
            pai[i] = orig;
            dist[i] = dist[orig] + G[orig][i];
            dfs(i,G);
        }
    }
}

int main(void)
{
    int orig = 0;
    int dest = 0;

    int **G = leitura(v, a);

    pai = (int *) malloc (sizeof (int)*v);
    dist = (int *) malloc (sizeof (int)*v);
    vist = (int *) malloc (sizeof (int)*v);

    for (int i = 0; i < v; i++)
    {
        pai[i] = -1;
        dist[i] = vist[i]  = 0;
    }

    // Imprime a matriz de adjacências
    for (int i = 0; i < v; i++)
    {
        for (int j = 0; j < v; j++)
            printf("%3d ", G[i][j]);
        printf("\n");
    }

    printf("\nDigite a origem: ");
    scanf("%d",&orig);
    printf("Digite o destino: ");
    scanf("%d",&dest);
    dfs(orig,G);
    percorrer(dest);

    return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *

*