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
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.
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!
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 =]
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!
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.
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.
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.