Hướng dẫn code thuật toán Kruskal

Hướng dẫn code thuật toán Kruskal bằng ngôn ngữ c

Bạn nhập ma trận bên dưới vào một tập tin có đuôi txt và lưu nó trên ô đĩa phù hợp với phần define trong đoạn code bên dưới.

#include <stdio.h>
#include <conio.h>
#define MAX 100
#define input “g:/test.txt”
typedef struct graph{
int n;
int a[MAX][MAX];
}DOTHI;
typedef struct EDGE{
int u;
int v;
int value;
}CANH;
int DocDoThi(DOTHI &g,char text[MAX]){
FILE *f;
f=fopen(text,”rt”);
if(f==NULL){
printf(“\n Khong tim thay tai lieu”);
return 0;
}
fscanf(f,”%d”,&g.n);
for(int i=0; i<g.n;i++){
for(int j=0; j<g.n;j++)
fscanf(f,”%d”,&g.a[i][j]);
}
fclose(f);
return 1;
}
void XuatDoThi(DOTHI g){
printf(“\n So dinh: %d”,g.n);
printf(“\n Ma tran: \n”);
for(int i=0; i<g.n;i++){
printf(“\t”);
for(int j=0; j<g.n;j++)
printf(“%d “,g.a[i][j]);
printf(“\n”);
}
}
void SapXepTang(CANH E[100], int tongsocanh){
CANH canhtam;
for(int i=0;i<tongsocanh-1;i++){
for(int j=i+1;j<tongsocanh;j++)
if(E[i].value >E[j].value){
canhtam = E[i];
E[i] = E[j];
E[j] = canhtam;
}
}
}
void Kruskal(DOTHI g){
CANH listEdge[MAX];
int tongsocanh = 0;
int i,j;
for(i=0;i<g.n;i++){
for(j=i+1;j<g.n;j++)
if(g.a[i][j]>0){
listEdge[tongsocanh].u = i;
listEdge[tongsocanh].v = j;
listEdge[tongsocanh].value = g.a[i][j];
tongsocanh++;
}
}
SapXepTang(listEdge,tongsocanh);
int nT = 0;
CANH T[MAX];
int nhan[MAX];
for(i=0;i<g.n;i++)
nhan[i] =i;
int canhdangxet = 0;
while(nT <g.n && canhdangxet <tongsocanh){
if(nhan[listEdge[canhdangxet].u] != nhan[listEdge[canhdangxet].v]){
T[nT] = listEdge[canhdangxet];
nT++;
int giatri = nhan[listEdge[canhdangxet].v];
for(j=0;j<g.n;j++)
if(nhan[j]==giatri)
nhan[j] = nhan[listEdge[canhdangxet].u];
}
canhdangxet++;
}
if(nT != g.n-1)
printf(“\nDo thi khong lien thong \n”);
else{
int TongTrongSoCuaCayKhung = 0;
printf(“\nDo thi lien thong\n”);
printf(“Cay khung nho nhat cua do thi la \n”);
for(i=0;i<nT;i++){
printf(“(%d,%d)”,T[i].u,T[i].v);
TongTrongSoCuaCayKhung += T[i].value;
}
printf(“\nTong gia tri cua cay khung la %d\n”,TongTrongSoCuaCayKhung);
}
}
int main(){
DOTHI g;
if(DocDoThi(g,input) == 1){
printf(“\n Doc do thi thanh cong”);
XuatDoThi(g);
printf(“\n Bam 1 phim bat ki de bat dau tim cay khung nho nhat theo thuat toan kruskal …\n\n”);
getch();
Kruskal(g);
}
getch();
}