Advertisement
Eduardo_Pires

trabalho quase terminado

Jun 27th, 2022 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /*
  5.  *  Alunos:
  6.  *  - Richardson Kuerten Silva 12111BSI231
  7.  *  - Marco Túlio Sousa Costa 12111BSI240
  8.  *  - Eduardo Santos Pires 12111BSI203
  9.  */
  10.  
  11. //-----------------------------------PILHA E SUAS FUNCOES----------------------------------------
  12.  
  13. typedef struct
  14. {
  15.     int tamanho;
  16.     int elementos[100];
  17.     int topo;
  18. } Pilha;
  19.  
  20. Pilha *cria(int *deucerto)
  21. {
  22.     Pilha *p = (Pilha *)malloc(sizeof(Pilha));
  23.  
  24.     if(p == NULL)
  25.     {
  26.         *deucerto = 0;
  27.     }
  28.     else
  29.     {
  30.         *deucerto = 1;
  31.     }
  32.  
  33.     p->topo=-1;
  34.     p->tamanho=100;
  35.  
  36.     return p;
  37. }
  38.  
  39. void libera(Pilha *p, int *deucerto)
  40. {
  41.     if(p == NULL)
  42.     {
  43.         *deucerto = 0;
  44.         return;
  45.     }
  46.     else
  47.     {
  48.         *deucerto = 1;
  49.         free(p);
  50.     }
  51. }
  52.  
  53. int cheia(Pilha *p)
  54. {
  55.     if(p->topo == p->tamanho-1)
  56.     {
  57.         return 1;
  58.     }
  59.     else
  60.     {
  61.         return 0;
  62.     }
  63. }
  64.  
  65. int vazia(Pilha *p)
  66. {
  67.     if(p->topo == -1)
  68.     {
  69.         return 1;
  70.     }
  71.     else
  72.     {
  73.         return 0;
  74.     }
  75. }
  76.  
  77. void empilha(Pilha *p, int elemento, int *deucerto)
  78. {
  79.     if(cheia(p))
  80.     {
  81.         *deucerto=0;
  82.     }
  83.     else
  84.     {
  85.         p->topo = p->topo+1;
  86.         p->elementos[p->topo] = elemento;
  87.         *deucerto = 1;
  88.     }
  89. }
  90.  
  91. int desempilha(Pilha *p, int *deucerto)
  92. {
  93.     int elementoretirado;
  94.  
  95.     if(vazia(p))
  96.     {
  97.         *deucerto = 0;
  98.         return;
  99.     }
  100.     else
  101.     {
  102.         elementoretirado = p->elementos[p->topo];
  103.         p->topo = p->topo-1;
  104.  
  105.         *deucerto = 1;
  106.     }
  107.  
  108.     return elementoretirado;
  109. }
  110.  
  111.  
  112. int main()
  113. {
  114.     int i, j;
  115.     int vertices;
  116.     //a variavel v representa a quantidade de vertices e dita o tamanho da matriz
  117.  
  118.     scanf("%d",&vertices);
  119.  
  120.     int **matriz;
  121.  
  122.     //alocando matriz dinamica
  123.     matriz = (int**) malloc(sizeof(int*) * vertices);
  124.     for(i=0; i<vertices; i++)
  125.     {
  126.         matriz[i] = (int*) malloc(sizeof(int) * vertices);
  127.     }
  128.  
  129.     //setando a matr5iz para 0
  130.     for(i=0; i<vertices; i++)
  131.     {
  132.         for(j=0; j<vertices; j++)
  133.         {
  134.             matriz[i][j]= 0;
  135.         }
  136.     }
  137.  
  138.     int aresta;
  139.     //a variavel a representa a quantidade de arestas, e sera condicao para um laco
  140.  
  141.     scanf("%d",&aresta);
  142.  
  143.     int x, y;
  144.     //x e y representa as conexoes de origem e destino respectivamente
  145.  
  146.     //laco que recebe as entradas dos valores das conexoes
  147.     for(i=0; i<aresta; i++)
  148.     {
  149.         int custo;
  150.         scanf("%d %d %d", &x, &y, &custo);
  151.  
  152.         //a indexacao da matriz comeca no zero em C, como recebemos comecando em 1 e preciso fazer -1
  153.         matriz[x-1][y-1] = custo;
  154.     }
  155.  
  156. //-------------------------------------comeco do algoritmo-----------------------
  157.  
  158.     //criando pilha
  159.     Pilha *p;
  160.     int deucerto;
  161.     p = cria(&deucerto);
  162.  
  163.     int origem, destino;
  164.  
  165.     //leitura origem destino
  166.     scanf("%d %d", &origem, &destino);
  167.  
  168.     //linha inicia com o valor da origem -1
  169.     int vizinho, linha = origem-1;
  170.  
  171.     //pilha inicia com o valor da origem
  172.     empilha(p, origem, &deucerto);
  173.  
  174.     i=0;
  175.     //laco que percorre linha da matriz
  176.     while(1)
  177.     {
  178.  
  179.         if(linha+1 == destino)
  180.         {
  181.             break;
  182.         }
  183.         if(vazia(p))
  184.         {
  185.             break;
  186.         }
  187.  
  188.         for(i; i<vertices; i++)
  189.         {
  190.  
  191.             //caso este ponto na matriz seja um vizinho, empilha o vizinho(eh o i)
  192.             if(matriz[linha][i] != 0)
  193.             {
  194.  
  195.                 vizinho = i;
  196.                 empilha(p, vizinho+1, &deucerto);
  197.                 linha = vizinho;
  198.  
  199.                 //quando encontrado novo vizinho percorre linha desde o comeco
  200.                 i=0;
  201.                 break;
  202.             }
  203.  
  204.             //caso percorremos toda linha e nao achou vizinho,
  205.             if(i==vertices-1 && matriz[linha][i]==0)
  206.             {
  207.  
  208.                 i = desempilha(p, &deucerto);
  209.                 //caso o que desempilhamos for correspondente o final de uma linha,
  210.                 //continua desempilhando pois significa que nao ha mais oq procurar
  211.                 while(i==vertices-1 && !vazia(p))
  212.                 {
  213.                     i = desempilha(p, &deucerto);
  214.                 }
  215.  
  216.                 if(!vazia(p))
  217.                 {
  218.                     linha = (desempilha(p, &deucerto)-1);
  219.                     empilha(p, linha+1, &deucerto);
  220.  
  221.                     break;
  222.                 }
  223.             }
  224.         }
  225.     }
  226.  
  227.     int custo=0, coluna;
  228.  
  229.     if(vazia(p))
  230.     {
  231.         custo = -1;
  232.     }
  233.     else
  234.     {
  235.         linha = desempilha(p, &deucerto) - 1;
  236.  
  237.         while(!vazia(p))
  238.         {
  239.             coluna = linha;
  240.             linha = desempilha(p, &deucerto) - 1;
  241.             custo = custo + matriz[linha][coluna];
  242.         }
  243.     }
  244.  
  245.     printf("%d\n", custo);
  246.  
  247.     //liberando a memória da matriz dinamica
  248.     for(i=0; i<vertices; i++)
  249.     {
  250.         free(matriz[i]);
  251.     }
  252.     free(matriz);
  253.  
  254.     //liberando a memória da pilha "p"
  255.     libera(p, &deucerto);
  256.  
  257.     return 0;
  258. }
  259.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement