最小生成树prim算法

来源:互联网 发布:扁皮弹弓皮筋长度算法 编辑:程序博客网 时间:2024/06/15 20:49

无向图
这里写图片描述
最小生成树
这里写图片描述

/*最小生成树prim算法*/#include <stdio.h>#define vnum 100#define MAX_INT 32767typedef 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);}

编译结果
这里写图片描述

原创粉丝点击