mirror of
https://github.moeyy.xyz/https://github.com/TheAlgorithms/C.git
synced 2023-10-11 15:56:24 +08:00
added Kruskal's Algorithm in Greedy approach
This commit is contained in:
parent
e5dad3fa8d
commit
8f7910a2e7
111
greedy_approach/Kruskal's Algorithm.c
Normal file
111
greedy_approach/Kruskal's Algorithm.c
Normal file
@ -0,0 +1,111 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#define MAX 30
|
||||
|
||||
typedef struct edge {
|
||||
int u, v, w;
|
||||
} edge;
|
||||
|
||||
typedef struct edge_list {
|
||||
edge data[MAX];
|
||||
int n;
|
||||
} edge_list;
|
||||
|
||||
edge_list elist;
|
||||
|
||||
int Graph[MAX][MAX], n;
|
||||
edge_list spanlist;
|
||||
|
||||
void kruskalAlgo();
|
||||
int find(int belongs[], int vertexno);
|
||||
void applyUnion(int belongs[], int c1, int c2);
|
||||
void sort();
|
||||
void print();
|
||||
|
||||
// Applying Kruskal Algo
|
||||
void kruskalAlgo() {
|
||||
int belongs[MAX], i, j, cno1, cno2;
|
||||
elist.n = 0;
|
||||
|
||||
for (i = 1; i < n; i++)
|
||||
for (j = 0; j < i; j++) {
|
||||
if (Graph[i][j] != 0) {
|
||||
elist.data[elist.n].u = i;
|
||||
elist.data[elist.n].v = j;
|
||||
elist.data[elist.n].w = Graph[i][j];
|
||||
elist.n++;
|
||||
}
|
||||
}
|
||||
|
||||
sort();
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
belongs[i] = i;
|
||||
|
||||
spanlist.n = 0;
|
||||
|
||||
for (i = 0; i < elist.n; i++) {
|
||||
cno1 = find(belongs, elist.data[i].u);
|
||||
cno2 = find(belongs, elist.data[i].v);
|
||||
|
||||
if (cno1 != cno2) {
|
||||
spanlist.data[spanlist.n] = elist.data[i];
|
||||
spanlist.n = spanlist.n + 1;
|
||||
applyUnion(belongs, cno1, cno2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int find(int belongs[], int vertexno) {
|
||||
return (belongs[vertexno]);
|
||||
}
|
||||
|
||||
void applyUnion(int belongs[], int c1, int c2) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
if (belongs[i] == c2)
|
||||
belongs[i] = c1;
|
||||
}
|
||||
|
||||
// Sorting algo
|
||||
void sort() {
|
||||
int i, j;
|
||||
edge temp;
|
||||
|
||||
for (i = 1; i < elist.n; i++)
|
||||
for (j = 0; j < elist.n - 1; j++)
|
||||
if (elist.data[j].w > elist.data[j + 1].w) {
|
||||
temp = elist.data[j];
|
||||
elist.data[j] = elist.data[j + 1];
|
||||
elist.data[j + 1] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
// Printing the result
|
||||
void print() {
|
||||
int i, cost = 0;
|
||||
|
||||
for (i = 0; i < spanlist.n; i++) {
|
||||
printf("\n%d - %d : %d", spanlist.data[i].u, spanlist.data[i].v, spanlist.data[i].w);
|
||||
cost = cost + spanlist.data[i].w;
|
||||
}
|
||||
|
||||
printf("\nSpanning tree cost: %d", cost);
|
||||
}
|
||||
|
||||
int main() {
|
||||
int i, j, total_cost;
|
||||
|
||||
printf("Enter the number of vertices: ");
|
||||
scanf("%d", &n);
|
||||
|
||||
printf("Enter the adjacency matrix (0 for no edge, weight for edge):\n");
|
||||
for (i = 0; i < n; i++)
|
||||
for (j = 0; j < n; j++)
|
||||
scanf("%d", &Graph[i][j]);
|
||||
|
||||
kruskalAlgo();
|
||||
print();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user