最小生成树prim算法

无向图

最小生成树

/*最小生成树prim算法*/
#include <stdio.h>
#define vnum 100
#define MAX_INT 32767
typedef struct graph
{
    int vexnum,arcnum;          /*顶点数、边数*/
    int edge[vnum][vnum];       /*邻接矩阵*/
}Graph;
/*G表示图的邻接矩阵的存储变量,V表示起始顶点下标*/
void Prim(Graph G,int v)
{
    int lowcost[vnum];          /*顶点i是否在u中*/
    int min;
    int closest[vnum],i,j,k;
    for(i=0;i<G.vexnum;i++)     /*给lowcost[]和closest[]置初值*/
    {
        lowcost[i]=G.edge[v][i];
        closest[i]=v;
    }
    for(i=1;i<G.vexnum;i++)     /*找出n-1个顶点*/
    {
        min=MAX_INT;
        for(j=0;j<G.vexnum;j++) /*在(v-u)中找出离u最近的顶点k*/
            if(lowcost[j]!=0 && lowcost[j]<min)
        {
            min=lowcost[j];
            k=j;                /*k记录最近顶点的编号*/
        }
        printf("边(%d,%d)权为:%d\n",closest[k],k,min);
        lowcost[k]=0;           /*标记k已经加入u*/
        for(j=1;j<G.vexnum;j++) /*修改数组lowcost和closest*/
            if(G.edge[k][j]!=0 && G.edge[k][j]<lowcost[j])
        {
            lowcost[j]=G.edge[k][j];
            closest[j]=k;
        }
    }
}
main()
{
    Graph G;
    int a,b,c,i,j;
    printf("请输入顶点个数和边的条数:\n");
    scanf("%d %d",&G.vexnum,&G.arcnum);
    for(i=0;i<G.vexnum;i++)
        for(j=0;j<G.vexnum;j++)
            G.edge[i][j]=MAX_INT;
    for(i=0;i<G.arcnum;i++)
    {
        printf("第%d条边:",i+1);
        scanf("%d %d %d",&a,&b,&c);
        G.edge[a][b]=c;
        G.edge[b][a]=c;
    }
    printf("最小生成树\n");
    Prim(G,0);
}

编译结果

你可能感兴趣的:(最小生成树prim算法)