Olá pessoal, sou o Filipe Névola, este blog foi muito ativo durante 2009 enquanto eu fazia universidade,
hoje em dia estou ativo no Twitter @FilipeNevola e voltando a escrever posts agora no meu perfil do Medium (29/05/2016).

[ 03/06/2009 ] 7

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
Andre comentou:

Muito bom seu blog, certamente ajudará muitas pessoas, uma recomendação que eu gostaria de fazer é para que você evitasse colocar o código assim, direto, acho que explicar com palavras, se bem explicado, é mais ilustrativo.
Mas excelente trabalho, parabéns.

Filipe Névola comentou:

Obrigado pelo dica, vou tentar melhorar nesse ponto.

É que certas vezes entender via comentários eu acho mais fácil, mas talvez não para todos. hehe.

Volte sempre!

Thiago F M comentou:

Gostei bastante, ajudou um bocado... se possivel posta mais sobre como usar STL na maratona e problemas envolvendo gráfos como esse. Achei que ficou bom os comentários e ajudou o entendimento, parabens e continue assim com o blog =]

Filipe Névola comentou:

Obrigado, sobre a STL já viu que tem material sobre set e map né?
Veja na seção Maratona.

E vou continuar postando conteúdos de grafos sim.

Volte sempre!

Phyllipe César comentou:

Parabéns, seu Blog está muito bom. O ruim de colocar o código, é que algumas pessoas nem lêem, vão apenas submeter, e terminam não aprendendo.

Filipe Névola comentou:

Phyllipe eu sei que alguns agem dessa maneiras, mas por causa deles precisamos penalizar os outros? Eu aprendi muita coisa lendo códigos prontos e acho que é uma boa maneira de ensinar.

Fica a dúvida do que realmente é o melhor.

Mas obrigado pela visita, sempre comente e faça suas sugestões.

Unknown comentou:

Muito bom, seu blog é uma luz na escuridão, ajuda bastante, você poderia apresentar um exemplo de entrada com a respectiva saída? Parabéns.

Novo Comentário