两个最小生成树算法前者适合稠密,后者适合稀疏,都是基于邻接矩阵的算法
Prim算法
#define INF 32767
void Prim(MGraph g,int v) {
int lowcost[MAXV];
int min;
int closest[MAXV],i,j,k;
for(i=0; i<g.n; i++) {
lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for(i=1; i<g.n; i++) {
min=INF;
for(j=0; j<g.n; j++)
if(lowcost[j]!=0 && lowcost[j]<min) {
min=lowcost[j];
k=j;
}
printf(" 边(%d,%d)权为:%d\n",closest[k],k,min);
lowcost[k]=0;
for(j=0; j<g.n; j++)
if(g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j]) {
lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}
Kruskal算法
#define MAXE 100
struct EdgeType {
int u;
int v;
int w;
};
void InsertSort(EdgeType E[],int n) {
int i,j;
EdgeType temp;
for(i=1; i<n; i++) {
temp=E[i];
j=i-1;
while(j>=0 && temp.w<E[j].w) {
E[j+1]=E[j];
j--;
}
E[j+1]=temp;
}
}
void Kruskal(MGraph g) {
EdgeType E[MAXE];
int i,j,m1,m2,sn1,sn2,k;
int vset[MAXV];
k=0;
for(i=0; i<g.n; i++)
for(j=0; j<g.n; j++)
if(g.edges[i][j]!=0 && g.edges[i][j]!=INF) {
E[k].u=i;
E[k].v=j;
E[k].w=g.edges[i][j];
k++;
}
InsertSort(E,g.e);
for(i=0; i<g.n; i++)
vset[i]=i;
k=1;
j=0;
while(k<g.n) {
m1=E[j].u;
m2=E[j].v;
sn1=vset[m1];
sn2=vset[m2];
if(sn1!=sn2) {
printf(" 边(%d,%d):%d\n",m1,m2,E[j].w);
k++;
for(i=0; i<g.n; i++)
if(vset[i]==sn2)
vset[i]=sn1;
}
j++;
}
}
暂无评论