Algoritmia - ALGORTIMO DE KRUSKAL

 
Vista:

ALGORTIMO DE KRUSKAL

Publicado por HILDA (1 intervención) el 29/03/2007 23:07:23
HOLA NECESITO HABER SI ME PUEDEN AYUDAR CON EL PROGRAMA DE ESTE ALGORITMO POR FIS SE LOS AGRADECERIA UN CHORRO POR FIS EN C
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Implementación del algoritmo de Kruskal en C

Publicado por Alejandro (307 intervenciones) el 11/03/2024 19:13:09
Aquí tienes una implementación simple del algoritmo de Kruskal en C. Este algoritmo se utiliza para encontrar el árbol de expansión mínima de un grafo ponderado no dirigido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <stdlib.h>
 
// Estructura para representar una arista
struct Edge {
    int src, dest, weight;
};
 
// Estructura para representar un conjunto disjunto
struct Subset {
    int parent;
    int rank;
};
 
// Función para encontrar el conjunto al que pertenece un elemento
int find(struct Subset subsets[], int i) {
    if (subsets[i].parent != i)
        subsets[i].parent = find(subsets, subsets[i].parent);
    return subsets[i].parent;
}
 
// Función para unir dos conjuntos en función de la clasificación por rango
void Union(struct Subset subsets[], int x, int y) {
    int xroot = find(subsets, x);
    int yroot = find(subsets, y);
 
    if (subsets[xroot].rank < subsets[yroot].rank)
        subsets[xroot].parent = yroot;
    else if (subsets[xroot].rank > subsets[yroot].rank)
        subsets[yroot].parent = xroot;
    else {
        subsets[yroot].parent = xroot;
        subsets[xroot].rank++;
    }
}
 
// Función principal del algoritmo de Kruskal
void KruskalMST(struct Edge edges[], int V, int E) {
    struct Subset *subsets = (struct Subset *)malloc(V * sizeof(struct Subset));
    for (int i = 0; i < V; i++) {
        subsets[i].parent = i;
        subsets[i].rank = 0;
    }
 
    qsort(edges, E, sizeof(edges[0]), [](const void *a, const void *b) -> int {
        return ((struct Edge *)a)->weight - ((struct Edge *)b)->weight;
    });
 
    struct Edge *result = (struct Edge *)malloc((V - 1) * sizeof(struct Edge));
 
    int e = 0;  // Índice del resultado, inicializado en 0
 
    for (int i = 0; e < V - 1 && i < E; i++) {
        struct Edge next_edge = edges[i];
 
        int x = find(subsets, next_edge.src);
        int y = find(subsets, next_edge.dest);
 
        if (x != y) {
            result[e++] = next_edge;
            Union(subsets, x, y);
        }
    }
 
    // Mostrar el resultado
    printf("Aristas seleccionadas en el árbol de expansión mínima:\n");
    for (int i = 0; i < e; i++)
        printf("(%d, %d) con peso %d\n", result[i].src, result[i].dest, result[i].weight);
 
    free(subsets);
    free(result);
}
 
// Programa principal
int main() {
    // Ejemplo de uso
    int V = 4;  // Número de vértices en el grafo
    int E = 5;  // Número de aristas en el grafo
 
    struct Edge edges[] = {
        {0, 1, 10},
        {0, 2, 6},
        {0, 3, 5},
        {1, 3, 15},
        {2, 3, 4},
    };
 
    KruskalMST(edges, V, E);
 
    return 0;
}

Este programa implementa el algoritmo de Kruskal en C. Puedes ajustar el tamaño del grafo y las aristas según tus necesidades. ¡Espero que sea útil, Hilda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar