要求:输入一个图,求出最小生成树。
输出最小生成树的边。
Prim算法
代码:
#include <stdio.h>
typedef struct graph{
int vexnum,arcnum;
int edge[100][100];
}Graph;
struct edge{
int adjvex;
int lowcost;
}closedge[105];
void Prim(Graph G,int start)
{
int i,j,k;
int min;
for(i=1;i<=G.arcnum;i++)
{
if(i!=start)
{
closedge[i].adjvex=start;
closedge[i].lowcost=G.edge[start][i];
}
}
closedge[start].lowcost=0;
for(i=2;i<=G.vexnum;i++)
{
min=100000;
for(j=1;j<=G.vexnum;j++)
{
if(closedge[j].lowcost && closedge[j].lowcost<min)
{
k=j;
min=closedge[j].lowcost;
}
}
printf("%d %d\n",closedge[k].adjvex,k);
closedge[k].lowcost=0;
for(j=1;j<=G.arcnum;j++)
{
if(G.edge[k][j]<closedge[j].lowcost)
{
closedge[j].lowcost=G.edge[k][j];
closedge[j].adjvex=k;
}
}
}
}
int main()
{
int i,j;
Graph G;
int n,m,a,b,c;
printf("请输入结点个数和边的条数:\n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请输入边:\n");
for(i=1;i<=G.arcnum;i++)
for(j=1;j<=G.arcnum;j++)
G.edge[i][j]=1000000;
for(i=1;i<=G.arcnum;i++)
{
scanf("%d %d %d",&a,&b,&c);
G.edge[a][b]=c;
G.edge[b][a]=c;
}//输入一个无向图
printf("最小生成树:\n");
Prim(G,1);
return 0;
}