THUẬT TOÁN KRUSKAL

#include<stdio.h>
// Do thi
#define MAX_VERTICES 100
typedef struct{
int u, v;
int w;
}Edge;
typedef struct{
int n, m;
Edge edges[MAX_VERTICES];
}Graph;
void init_graph(Graph* G, int n){
G->n = n;
G->m = 0;
}
void add_edge(Graph* G, int u, int v, int w){
G->edges[G->m].u = u;
G->edges[G->m].v = v;
G->edges[G->m].w = w;
G->m++;
}
// Giai thuat
int parent[MAX_VERTICES];
int FindRoot(int u){
if (parent[u]==u)
return u;
return FindRoot(parent[u]);
}
void Swap(Edge* a, Edge* b){
Edge temp;
temp = *a;
*a = *b;
*b = temp;
}
void Bubble_Sort(Edge a[], int n){
int i, j;
for(i=0; i<=n-2; i++){
for(j=n-1; j>=i+1; j--){
if(a[j].w < a[j-1].w){
Swap(&a[j],&a[j-1]);
}
}
}
}
int Kruskal(Graph* G, Graph* T){
Bubble_Sort(G->edges,G->m);
int e;
init_graph(T,G->n);
for(e=1; e<=G->n; e++)
parent[e] = e;
int sum_w = 0;
for(e=0; e<G->m; e++){
int u = G->edges[e].u;
int v = G->edges[e].v;
int w = G->edges[e].w;
int root_u = FindRoot(u);
int root_v = FindRoot(v);
if (root_u != root_v){
add_edge(T,u,v,w);
parent[root_v] = root_u;
sum_w += w;
}
}
return sum_w;
}
int main(){
// freopen("dt.txt", "r", stdin);
Graph G, T;
int n, m, e, x, y, w;
scanf("%d%d",&n,&m);
init_graph(&G,n);
for(e=1;e<=m;e++){
scanf("%d%d%d",&x,&y,&w);
add_edge(&G,x,y,w);
}
int sum_w = Kruskal(&G,&T);
printf("%d \n",sum_w);
for(e=0; e<T.m; e++){
if(T.edges[e].u >T.edges[e].v)
printf("%d %d %d \n",T.edges[e].v,T.edges[e].u,T.edges[e].w);
else
printf("%d %d %d \n",T.edges[e].u,T.edges[e].v,T.edges[e].w);
}
return 0;
}