初学数据结构(最小生成树)
初学数据结构(最小生成树)
《数据结构教程》第6版,P308
prim算法(exp8-5)
//
// Created by Snow on 2023/4/23.
//
#include"graph.cpp"
void Prim(MatGraph g,int v)
{
int lowcost[MAXV];
int mindist;
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++)
{
mindist=INF;
for(j=0;j<g.n;j++)
{
if(lowcost[j]!=0&&lowcost[j]<mindist)
{
mindist=lowcost[j];
k=j;
}
}
printf("边(%d,%d)权为:%d\n",closest[k],k,mindist);
lowcost[k]=0;
for(j=0;j<g.n;j++)
{
if(lowcost[j]!=0&&g.edges[k][j]<lowcost[j])
{
lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}
}
int main()
{
MatGraph g;
int A[MAXV][MAXV]={
{0,5,8,7,INF,3},
{5,0,4,INF,INF,INF},
{8,4,0,5,INF,9},
{7,INF,5,0,5,6},
{INF,INF,INF,5,0,1},
{3,INF,9,6,1,0}};
int n=6, e=9;
CreateMat(g,A,n,e);
printf("输出邻接矩阵G:\n");
DispMat(g);
int v=0;
printf("从顶点%d开始的最小生成树为:\n",v);
Prim(g,v);
return 0;
}
Kruskal算法(exp8-6)
//
// Created by Snow on 2023/4/23.
//
#include"graph.cpp"
#define MaxSize 100
typedef struct
{
int u;
int v;
int w;
}Edge;
//插入排序
void InsertSort(Edge E[],int n)
{
int i,j;
Edge temp;
for(i=0;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(MatGraph g)
{
int i,j,u1,v1,sn1,sn2,k;
int vest[MAXV];
Edge E[MaxSize];
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++)
vest[i]=i;
k=1;
j=0;
while(k<g.n)
{
u1=E[j].u;
v1=E[j].v;
sn1=vest[u1];
sn2=vest[v1];
if(sn1!=sn2)
{
printf("(%d,%d):%d\n",u1,v1,E[j].w);
k++;
for(i=0;i<g.n;i++)
{
if(vest[i]==sn2)
vest[i]=sn1;
}
}
j++;
}
}
int main()
{
MatGraph g;
int A[MAXV][MAXV]={
{0,5,8,7,INF,3},
{5,0,4,INF,INF,INF},
{8,4,0,5,INF,9},
{7,INF,5,0,5,6},
{INF,INF,INF,5,0,1},
{3,INF,9,6,1,0}};
int n=6, e=9;
CreateMat(g,A,n,e);
printf("输出邻接矩阵G:\n");
DispMat(g);
printf("Kruskal:\n");
Kruskal(g);
return 0;
}