Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.16 KB | None | 0 0
  1. //Bibliotecas
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. //Variáveis
  7. int destino, origem, vertices = 0;
  8. int custo, *custos = NULL;
  9.  
  10. //Prototipação
  11. void dijkstra(int vertices,int origem,int destino,int *custos);
  12. void menu_mostrar(void);
  13. void grafo_procurar(void);
  14. void grafo_criar(void);
  15.  
  16. //Função principal
  17. int main(int argc, char **argv) {
  18.   int opt = -1;
  19.   //Laço principal do menu
  20.   do {
  21.     //Desenha o menu na tela
  22.     menu_mostrar();
  23.     scanf("%d", &opt);
  24.     switch (opt) {
  25.       case 1:
  26.         //cria um novo grafo
  27.         grafo_criar();
  28.       break;
  29.       case 2:
  30.         //procura os caminhos
  31.         if (vertices > -1) {
  32.           grafo_procurar();
  33.         }
  34.       break;
  35.     }
  36.   } while (opt != 10);
  37.   printf("\nAlgoritmo de Dijkstra finalizado...\n\n");
  38.   system("pause");
  39.   return 0;
  40. }
  41.  
  42. //Implementação do algoritmo de Dijkstra
  43. void dijkstra(int vertices,int origem,int destino,int *custos)
  44. {
  45.   int i, v, cont = 0;
  46.   int *ant, *tmp;
  47.   int *z;  /* vertices para os quais se conhece o caminho minimo */
  48.   double min;
  49.   double dist[vertices]; /* vetor com os custos dos caminhos */
  50.   /* aloca as linhas da matriz */
  51.   ant = (int*) calloc (vertices, sizeof(int *));
  52.   if (ant == NULL) {
  53.     system("color fc");
  54.     printf ("** Erro: Memoria Insuficiente **");
  55.     exit(-1);
  56.   }
  57.   tmp = (int*) calloc (vertices, sizeof(int *));
  58.   if (tmp == NULL) {
  59.     system("color fc");
  60.     printf ("** Erro: Memoria Insuficiente **");
  61.     exit(-1);
  62.   }
  63.   z = (int *) calloc (vertices, sizeof(int *));
  64.   if (z == NULL) {
  65.     system("color fc");
  66.     printf ("** Erro: Memoria Insuficiente **");
  67.     exit(-1);
  68.   }
  69.   for (i = 0; i < vertices; i++) {
  70.     if (custos[(origem - 1) * vertices + i] !=- 1) {
  71.         ant[i] = origem - 1;
  72.         dist[i] = custos[(origem-1)*vertices+i];
  73.     }
  74.     else {
  75.         ant[i]= -1;
  76.         dist[i] = HUGE_VAL;
  77.     }
  78.     z[i]=0;
  79.   }
  80.   z[origem-1] = 1;
  81.   dist[origem-1] = 0;
  82.   /* Laco principal */
  83.   do {
  84.     /* Encontrando o vertice que deve entrar em z */
  85.     min = HUGE_VAL;
  86.     for (i=0;i<vertices;i++){
  87.         if (!z[i]){
  88.             if (dist[i]>=0 && dist[i]<min) {
  89.                 min=dist[i];v=i;
  90.             }
  91.         }
  92.     }
  93.     /* Calculando as distancias dos novos vizinhos de z */
  94.     if (min != HUGE_VAL && v != destino - 1) {
  95.         z[v] = 1;
  96.         for (i = 0; i < vertices; i++){
  97.             if (!z[i]) {
  98.                 if (custos[v*vertices+i] != -1 && dist[v]
  99.                     + custos[v*vertices+i] < dist[i]) {
  100.                     dist[i] = dist[v] + custos[v*vertices+i];
  101.                     ant[i] =v;
  102.                 }
  103.             }
  104.         }
  105.     }
  106.   }while (v != destino - 1 && min != HUGE_VAL);
  107.  
  108.   /* Mostra o Resultado da busca */
  109.   printf("\tDe %d para %d: \t", origem, destino);
  110.   if (min == HUGE_VAL) {
  111.     printf("Nao Existe\n");
  112.     printf("\tCusto: \t- \n");
  113.   }
  114.   else {
  115.     i = destino;
  116.     i = ant[i-1];
  117.     while (i != -1) {
  118.         tmp[cont] = i+1;
  119.         cont++;
  120.         i = ant[i];
  121.     }
  122.     for (i = cont; i > 0 ; i--) {
  123.         printf("%d -> ", tmp[i-1]);
  124.     }
  125.     printf("%d", destino);
  126.     printf("\n\tCusto:  %d\n",(int) dist[destino-1]);
  127.   }
  128. }
  129.  
  130. void grafo_criar(void){
  131.   do {
  132.     printf("\nInforme o numero de vertices (no minimo 3 ): ");
  133.     scanf("%d", &vertices);
  134.   } while (vertices < 3 );
  135.   if (!custos) {
  136.     free(custos);
  137.   }
  138.   custos = (int *) malloc(sizeof(int)*vertices*vertices);
  139.   //Se o compilador falhou em alocar espaço na memória
  140.   if (custos == NULL) {
  141.     system("color fc");
  142.     printf ("** Erro: Memoria Insuficiente **");
  143.     exit(-1);
  144.   }
  145.   //Preenchendo a matriz com -1
  146.   for (int i = 0; i <= vertices * vertices; i++){
  147.     custos[i] = -1;
  148.     }
  149.   do {
  150.     system("cls");
  151.     printf("Entre com as Arestas:\n");
  152.     do {
  153.         printf("Origem (entre 1 e %d ou ‘0’ para sair): ", vertices);
  154.         scanf("%d", &origem);
  155.     } while (origem < 0 || origem > vertices);
  156.     if (origem) {
  157.         do {
  158.             printf("Destino (entre 1 e %d, menos %d): ", vertices, origem);
  159.             scanf("%d", &destino);
  160.         } while (destino < 1 || destino > vertices || destino == origem);
  161.         do {
  162.             printf("Custo (positivo) do vertice %d para o vertice %d: ",
  163.             origem, destino);
  164.             scanf("%d",&custo);
  165.         } while (custo < 0);
  166.         custos[(origem-1) * vertices + destino - 1] = custo;
  167.     }
  168.   } while (origem);
  169. }
  170.  
  171. //Busca os menores caminhos entre os vértices
  172. void grafo_procurar(void){
  173.   int i, j;
  174.   system("cls");
  175.   system("color 03");
  176.   printf("Lista dos Menores Caminhos no Grafo Dado: \n");
  177.   for (i = 1; i <= vertices; i++) {
  178.     for (j = 1; j <= vertices; j++) {
  179.       dijkstra(vertices, i,j, custos);
  180.     }
  181.     printf("\n");
  182.   }
  183.   system("pause");
  184.   system("color 07");
  185. }
  186.  
  187. //Desenha o menu na tela
  188. void menu_mostrar(void){
  189.   system("cls");
  190.   printf("Implementacao do Algoritmo de Dijasktra\n");
  191.   printf("Opcoes:\n");
  192.   printf("\t 1 - Adicionar um Grafo\n");
  193.   printf("\t 2 - Procura Os Menores Caminhos no Grafo\n");
  194.   printf("\t 0 - Sair do programa\n");
  195.   printf("? ");
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement