[ 05/06/2009 ] 0 TwitThis

A viagem de Teobaldo - SPOJ - 1818 Teobaldo

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 largura (BFS), partindo da origem e a cada passo vamos marcando na matriz de enfileiramento que aquela cidade já está na fila daquele dia.
Dessa maneira conseguimos determinar se é possível ou não chegar ao destino.

Obs: BFS significa Breadth First Search (Busca Primeiro em Largura).

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>

#define NMAX 101
#define MAXD 201

//matriz de adjâcencia
short g[NMAX][NMAX];

int dias[NMAX*MAXD];//cada dia esta em que ponto do caminho
int fila[NMAX*MAXD];
int enf[MAXD][MAXD];//marcacao dos enfileirados
int o,d,dia;
int n;

int main(){
int m,i,j,x,y,v;
int fim,ini;
bool pode;
while(scanf("%d %d",&n,&m)==2&&n){
//o grafo está zerado
memset(g,0,sizeof(g));
//não tem nada enfileirado
memset(enf,0,sizeof(enf));
//todas não foram visitadas
memset(dias,-1, sizeof(dias));

for(i=0;i<m;++i){
scanf("%d %d",&x,&y);
//grafo bidirecional, marca pros 2 lados
g[x][y]=g[y][x]=1;
}
//lê origem, destino e número de dias
scanf("%d %d %d",&o,&d,&dia);

pode=false;
/**CASO ESPECIAL, QNDO NÚMERO DE DIAS É 0(ZERO)**/
if(dia==0){//em nenhum dia nao sai da cidade
if(o==d)//se a origem é igual ao destino
pode=true;//viagem ideal
//se origem é diferente do destino viagem nao é ideal pois nao ira mudar d cidade
}
/**CASO COMUM**/
else{
fim=1;//fim da fila
ini=0;//inicio da fila
fila[0]=o;//posicao inicial da fila é a cidade de origem
dias[0]=0;//dia 0
while(ini<fim && dias[ini]<dia){//enqto o dia atual é menor que o dia IDEAL
v=fila[ini];//tira da fila
for(i=1;i<=n;++i){//roda os vertices
if(g[v][i] && !enf[i][dias[ini]+1]){//existe a aresta e este vertice ainda nao
//está na fila do proximo dia
fila[fim]=i;//poe na fila
dias[fim]=dias[ini]+1;//aumenta um dia
enf[i][dias[fim]]=1;//o vertice esta na fila
if(dias[fim]==dia && i==d){//se chegou no dia IDEAL e o vertice é o destino
ini=fim=0;//esvazia a fila
pode=true;//viagem como teobaldo desejava
break;
}
fim++;//aumenta tamanho da fila
}
}
ini++;//proximo vertice da fila
}
}
if(pode)
printf("Yes, Teobaldo can travel.\n");
else
printf("No, Teobaldo can not travel.\n");
}
}
Alguma dúvida? Pergunte através dos comentários!
A viagem de Teobaldo - SPOJ - 1818 Teobaldo

Novo Comentário