求最小生成树——kruskal算法(邻接矩阵)
#include<stdio.h>
#include<stdlib.h>
#define MAXLEAF 100
#define INF 100000
#define EDGENUMBER MAXLEAF*MAXLEAF/2
typedef int EdgeType;
typedef int VertexType;
typedef struct{
EdgeType val[MAXLEAF][MAXLEAF];
VertexType ves[MAXLEAF];
int v;
int e;
}MGraph;
typedef struct{
int vex1,vex2;
int w;
}kedge;
void creat_MGraph(MGraph *M){
int i,j,k;
int w;
scanf("%d%d",&(M->v),&(M->e));
for(i=0;i<M->v;i++)
scanf("%d",&(M->ves[i]));
for(i=0;i<M->v;i++)
for(j=0;j<M->v;j++)
if(i==j) M->val[i][j]=0;
else M->val[i][j]=INF;
for(k=0;k<M->e;k++)
{
scanf("%d%d%d",&i,&j,&w);
M->val[i-1][j-1]=w;
M->val[j-1][i-1]=w;
}
}
VertexType kruskal(MGraph M){
int tag[MAXLEAF];
kedge Ke[EDGENUMBER];
int i,j;
VertexType length=0;
int n=0;
for(i=0;i<M.v;i++) tag[i]=i;
for(i=0;i<M.v;i++)
for(j=i+1;j<M.v;j++)
if(M.val[i][j]!=INF){
Ke[n].vex1=i;
Ke[n].vex2=j;
Ke[n++].w=M.val[i][j];
}
kedge temp;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(Ke[j].w>Ke[j+1].w){
temp=Ke[j+1];
Ke[j+1]=Ke[j];
Ke[j]=temp;
}
for(i=0;i<n;i++){
int first,second;
first = tag[Ke[i].vex1];
second = tag[Ke[i].vex2];
if(first!=second){
length+=Ke[i].w;
printf("%d->%d: %d\n",Ke[i].vex1,Ke[i].vex2,Ke[i].w);
tag[Ke[i].vex2]=first;
for(j=0;j<M.v;j++){
if(second==tag[j])
tag[j]=first;
}
}
}
return length;
}
int main(){
MGraph M;
int len;
creat_MGraph(&M);
printf("最小生成树:\n");
len=kruskal(M);
printf("最小成本:%d",len);
return 0;
}