Advertisement
Guest User

Kruskal with selection sort

a guest
Jun 11th, 2018
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. /*
  2.  * Algoritmo de Kruskal com selection sort
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <time.h>
  8.  
  9. #define fori(i, b, n) for(int i = b; i<n; ++i)
  10.  
  11. using namespace std;
  12.  
  13. struct aresta{
  14.     int v1;
  15.     int v2;
  16.     int peso;
  17. };
  18.  
  19. //vetor utilizado para a detecçao de ciclos tamanho é a quantidade maxima de vertices
  20. int ciclo[62816];
  21.  
  22. //detectar ciclos
  23. void unir(int v1, int v2);
  24. int pai(int x);
  25. //ordenar as arestas pelo peso
  26. void insertionSort( aresta *A, int tamanhoVetor );
  27.  
  28. int main (){
  29.  
  30.   int n, m;
  31.   scanf("%d %d", &n, &m);   //lendo os vertices e as arestas
  32.   //vetor para armazenar as arestas:
  33.   aresta arestas[m];
  34.  
  35.     //iniciando o vetor de ciclos
  36.     fori(i, 0, n){ //se os vertices forem numerados de 0 a n colocar n+1 no lugar de n
  37.         ciclo[i] = i;
  38.     }
  39.     //lendo e armazenando as arestas
  40.     fori(i, 0, m){
  41.         scanf("%d %d %d", &arestas[i].v1, &arestas[i].v2, &arestas[i].peso);
  42.     }
  43.  
  44.     //ordenando pelo peso
  45.     insertionSort(arestas, m);
  46.  
  47.     //kruskal, percorre todas as arestas
  48.     fori(i, 0, m){
  49.  
  50.         //detectando se com esta aresta forma ciclo:
  51.         if ( pai(arestas[i].v1) != pai(arestas[i].v2) ){
  52.  
  53.             //imprimindo a aresta que está na arvore geradora minima em ordem crescente de vertices
  54.             if(arestas[i].v1 < arestas[i].v2){
  55.                 printf("%d %d\n", arestas[i].v1, arestas[i].v2);
  56.             }
  57.             else{
  58.                 printf("%d %d\n", arestas[i].v2, arestas[i].v1);
  59.             }
  60.  
  61.             unir(arestas[i].v1, arestas[i].v2);
  62.         }
  63.  
  64.     }
  65.     printf("\n");
  66. }
  67.  
  68. void unir(int v1, int v2){
  69.     ciclo[pai(v1)] = pai(v2);
  70. }
  71.  
  72. int pai(int v){
  73.     if (ciclo[v] == v){
  74.         return v;
  75.     }
  76.     ciclo[v] = pai(ciclo[v]);
  77.  
  78.     return ciclo[v];
  79. }
  80.  
  81. void insertionSort( aresta *A, int tamanhoVetor ){
  82.   //valor maximo do peso
  83.   aresta peso[62816];
  84.  
  85.   //declarando o tempo
  86.   clock_t Ticks[2];
  87.   Ticks[0] = clock();
  88.  
  89.     int i, j=0;
  90.   aresta aux;
  91.  
  92.   for(i=0;  i<(tamanhoVetor - 1); i++){
  93.     int menor = i;
  94.     for(j=(i+1); j<tamanhoVetor; j++){
  95.       if(strcmp( peso[menor] > peso[j]) == 0){
  96.         menor = j;
  97.       }
  98.     }
  99.     aux = peso[menor];
  100.     peso[menor] = peso[i];
  101.     peso[i] = aux;
  102.   }
  103.  
  104.   //calculando o tempo da ordenação
  105.   Ticks[1] = clock();
  106.   double Tempo = (Ticks[1] - Ticks[0]) * 1000.0 / CLOCKS_PER_SEC;
  107.   printf("Tempo gasto: %g ms.", Tempo);
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement