Grafo
Publicado por Fabio Curtis Volpe 10/12/2004
[ Hits: 11.845 ]
Esse script é de um grafo que usa fila.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAX 10
#define TAMANHO_NOME 30
#define SAO_PAULO 0
#define NOVA_YORK 1
#define LOS_ANGELES 2
#define LONDRES 3
#define FRANKFURT 4
#define TOKIO 5
#define SYDNEY 6
//globais
int GrafoCidades[MAX][MAX]; //grafo
int CorCidades[MAX]; //cidades acessadas
char NomeCidades[MAX][TAMANHO_NOME]; //nome das cidades
int inicio=0; //inicio fila
int tamanho; //fila para o modulo
int fila[500]; //tamanho fila (bem maior para caber as combinacoes)
//prototipos
void CaminhoNoGrafo(int cidadeInicio); //grafo
void inserirFILA(int x); //insere na fila ( fila circular )
int removerFILA(); //remove (fila circular)
//----------------------------------------------------------------------------
int main()
{
int i,j;
//inicia grafo com tudo -1
for (i=0; i< MAX; i++)
{
for (j=0; j< MAX; j++)
{
GrafoCidades[i][j]= -1;
}
}
//monta o grafo
GrafoCidades[SAO_PAULO][NOVA_YORK]= 350;
GrafoCidades[SAO_PAULO][LONDRES]= 400;
GrafoCidades[NOVA_YORK][LOS_ANGELES]= 150;
//GrafoCidades[NOVA_YORK][FRANKFURT]= 250;
//GrafoCidades[NOVA_YORK][LONDRES]= 120;
GrafoCidades[LONDRES][FRANKFURT]= 80;
//GrafoCidades[LONDRES][SYDNEY]= 500;
//GrafoCidades[LONDRES][SAO_PAULO]= 400;
GrafoCidades[LONDRES][NOVA_YORK]= 120;
GrafoCidades[FRANKFURT][TOKIO]= 500;
GrafoCidades[LOS_ANGELES][TOKIO]= 400;
//GrafoCidades[LOS_ANGELES][SYDNEY]= 450;
GrafoCidades[TOKIO][SYDNEY]= 300;
GrafoCidades[SYDNEY][TOKIO]= 500;
//monta os nomes das cidades
strcpy(NomeCidades[0],"Sao Paulo-GRU");
strcpy(NomeCidades[1],"Nova York-JFK");
strcpy(NomeCidades[2],"Los Angeles");
strcpy(NomeCidades[3],"Londres-LHR");
strcpy(NomeCidades[4],"Frankfurt");
strcpy(NomeCidades[5],"Tokio");
strcpy(NomeCidades[6],"Sydney");
//imprimi todas as cidades na tela com o numero dela
printf("Grafo gerado com as cidades :\n");
for (i=0; i < MAX; i++)
{
printf("%i : %s\n", i, NomeCidades[i]);
}
printf("\n\nTodas as cidades possiveis apartir de : %s\n",NomeCidades[LONDRES]);
//calcula o caminho no grafo
CaminhoNoGrafo(LONDRES);
getchar();
}
//--------------------------------------------------------------------------
void CaminhoNoGrafo(int cidadeInicio)
{
int i,j;
int cidadeBase,retFILA;
//inicia todas as cidades com a cor branca (nao visitada)
for (i=0; i< MAX; i++)
{
CorCidades[i]= 0;
}
cidadeBase= cidadeInicio; //cidade inicial vai para cidadebase para calcular as ligacoes
while (cidadeBase != -1)
{
// Marcar cidadeBase com a cor preta (ja visitada)
CorCidades[cidadeBase]= 2;
for (j=0; j<MAX; j++)
{
//se tiver ligacao, coloca na fila
if ( (GrafoCidades[cidadeBase][j] != -1) && (CorCidades[j]==0) )
{
inserirFILA(j);
CorCidades[j]==2;//cor preta (ja visitada)
}
} //for
// retira da fila uma cidade base (passa para a proxima cidade com ligacao)
cidadeBase=removerFILA();
} //while
for (i=0; i< MAX; i++)
{
if (CorCidades[i]==2)
{
printf("\n%s ",NomeCidades[i]);
}
} // for
} // RotaMaisBarata
//----------------------------------------------------------------------------
void inserirFILA(int x)
{
if ( tamanho == MAX ) //se tamanho da fila for = ao MAXimo da fila , fila cheia
{
printf("\nFila esta cheia\n");
}
else
{
fila[ (inicio + tamanho) % MAX] = x; //(inicio + tamanho) % MAX eh a posicao do proximo elemento
tamanho++; //incrementa o tamanho pq foi inserido mais um elemento
}
}
//----------------------------------------------------------------------------
int removerFILA()
{
int aux;
if(tamanho!=0) //tamanho !0 = a fila nao vazia
{
aux=fila[inicio]; //quarda em aux o valor antes de removerFILA ele da fila
fila[inicio]=-1; //zera o valor da fila
inicio++; //incrementa o inicio para localizar o proximo com o modulo
inicio = inicio % MAX; //localiza o proximo elemento com o modulo
tamanho--; //decrementa o tamanho pq removeu o elemento da fila
return(aux); //retorna o valor removido
}
else
{
// tamanho da fila = 0 , fila vazia
return(-1);
}
}
Como verificar a validade de um CPF
Gerando uma "number list" de 6 digitos
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Programa fora de escala na tela do pc (40)
\Boot sem espaço em disco (Fedora KDE Plasma 42) (5)
Preciso recuperar videos *.mp4 corrompidos (0)









