Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Kruskal

0 views

Published on

  • Be the first to comment

  • Be the first to like this

Kruskal

  1. 1. #include<stdio.h> #include<stdlib.h> #include<time.h> #define INFINITO 999 #define MAX 100 void imprime(int a[][MAX],int n); void matriz(int a[][MAX], int n){ int i,j; srand(time(0)); for(i = 0;i < n; i++) { for(j = 0;j < i; j++) { a[i][j] = a[j][i]= rand()%50; if( a[i][j]>40)a[i][j]=a[j][i]=INFINITO; } a[i][i] = INFINITO; } imprime(a,n); } void imprime(int a[][MAX],int n){ int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%dt",a[i][j]); } printf("n"); } return; } int comprobacion_nodos(int aux_j,int p[]){ while(p[aux_j] != aux_j){ aux_j = p[aux_j]; } return aux_j; } void union_ij(int i,int j,int p[]){//le quitamos el valor que tenga el arreglo p[] en ese momento y lo vamos sustituyendo por if(j > i){ p[j] = i; }else{ p[i] = j; } return; } void kruskal(int a[][MAX],int n){ int count, i, p[MAX], min, j, aux_i, aux_j, k, matriz_temporal[MAX][MAX],
  2. 2. sum; count = k = sum = 0; for(i = 0; i < n; i++) { p[i] = i; } while(count < n) { min = INFINITO; // hacemos min 999 for(i = 0; i < n; i++) { for(j = 0;j < n; j++) { if(a[i][j] < min) { min = a[i][j]; //asignamos el valor de min a el valor minimo posible aux_i = i; // aux_i variable que guarda el nodo que participa en la distancia mas orta posible aux_j = j; // aux_j variable auxiliar que guarda el nodo que participa en la distancia mas orta posible } } } if(min != INFINITO) { i = comprobacion_nodos(aux_i, p); j = comprobacion_nodos(aux_j, p); if (i != j) { matriz_temporal[k][0] = aux_i;//es nuestra matriz auxiliar para guardar los valores de la distancia mas corta matriz_temporal[k][1] = aux_j; k++; sum += min; union_ij(i,j,p); } a[aux_i][aux_j] = a[aux_j][aux_i] = INFINITO; } count +=1; } if(count != n) { printf("no existe el arbol de expansionn"); } if(count == n) { printf("El arbol de expansion minima es:n"); for(k = 0; k < n-1 ; k++) { printf(" %d -> %d ",matriz_temporal[k][0],matriz_temporal[k][1]); } printf("ncosto total = %d n",sum); }
  3. 3. return; } int main(int pepe, char** juan) { int a[MAX][MAX],n; printf("Dame el numero de nodosn"); scanf("%d",&n); matriz(a,n); kruskal(a,n); return 45; }

×