[ 03/06/2009 ] 0 TwitThis

Passeio de Bicicleta - SPOJ - 829 PASSEIO

Categoria: Grafos (DFS)

Explicações teóricas sobre Grafos aqui

Resumo: Dado a origem, determinar a distância máxima que pode ser alcançada

Explicação: Nos comentários temos a explicação detalhada de cada passo. Mas de forma geral, vamos realizar uma busca em profundidade (DFS), partindo da origem e vamos marcando a distância atual e comparando com a maior que já temos guardada, se essa atual for maior nós guardamos ela.

No final da DFS nós retornamos a distância atual, que é a distância do último vértice explorado, o mais distante da origem.

Obs: DFS significa Depth First Search (Busca Primeiro em Profundidade).

Vamos ao código:


//Autor: Filipe Areias Névola
//Ano: 2008
//Licensa: Você pode usar e alterar, mas deve manter o Autor
#include <stdio.h> //Biblioteca padrão de entrada e saída
#include <string.h>

//número máximo de vértices
#define MAX 151

//vetor de alturas e de distâncias
int alt[MAX], dist[MAX];
//g é a matriz de adjacência que representa o grafo
int g[MAX][MAX];
//número de pontos turísticos
int p;

//Busca Primeiro em Profundidade
int buscaprof(int atual){
    //q vai ser o vértice atual e disttemp a distância na volta do backtracking
    int q, disttemp;
    //se ainda não foi visitado
    if (dist[atual] == -1){
        //distancia vale 0 pois ele é o atual
        dist[atual] = 0;
        for (q = 1; q <= p; q++){
            //se existe o caminho
            if (g[atual][q]){
                //começa a explorar esse vértice e dá um passo(soma 1)
                disttemp = buscaprof(q) + 1;
                //acabaram os vertices por esta caminho confere se essa distancia temporaria é maior que a atual
                if (disttemp > dist[atual]){
                    dist[atual] = disttemp;
                }
            }
        }
    }
    return dist[atual];
}
//Parte principal do programa
int main(){
    /**declarações**/
    int i,x,y,l,o,teste=1,v,fim,ini;

    /**entrada de dados e processamento**/
    while (scanf("%d %d %d", &p, &l, &o)==3&&p){//p==pontos turistico, l==caminhos, o==origem
        for (i = 1; i <= p; ++i){
            //pega altura dos pontos
            scanf("%d", &alt[i]);
        }

        //zerando a matriz de adjacência, para indicar que ainda não tem arestas
        memset(g, 0, sizeof(g));

        //vai montar o grafo baseado nas alturas
        for (i = 0; i < l; ++i){
            scanf("%d %d", &x, &y);
            //se é descida
            if (alt[x] > alt[y]){
                //esse caminho é valido então marca essa aresta
                g[x][y]=1;
            }
        }

        //colocando o valor -1 em todas as posições do vetor dist
        //para indicar que nenhum vértice foi visitado ainda
        memset(dist, -1, sizeof(dist));

        //chama a busca para achar a maior distancia e já imprime seu retorno
        printf("Teste %d\n%d\n\n", teste++, buscaprof(o));
    }
    return 0;
}

Alguma dúvida? Pergunte através dos comentários!

Passeio de Bicicleta - SPOJ - 829 PASSEIO

Novo Comentário