您的位置:首页 > 其它

Prim算法实现

2010-12-21 14:37 615 查看
#include "stdio.h"
#define MAX_VERTEX_NUM 20
typedef struct ArcCell{
int adj;
char *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
char vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
}MGraph;
struct {
int adjvex;
int lowcost;
}closedge[MAX_VERTEX_NUM];
int minimum(int n)
{
int i,k=0,min=65536;
for(i=0;i<n;i++)
{
if(closedge[i].lowcost>0 && closedge[i].lowcost<min )
{
min=closedge[i].lowcost;
k=i;
}
}

return k;
}

//u直接是顶点的编号
void MiniSpanTree_PRIM(MGraph G,int k)
{
int i,j;
for(j=0;j<G.vexnum;++j)
{
if(j!=k)
{
closedge[j].adjvex=k;
closedge[j].lowcost=G.arcs[k][j].adj;
}
}
closedge[k].lowcost=0;
for(i=1;i<G.vexnum;++i)
{
k=minimum(G.vexnum);
printf("%d/n",k);
closedge[k].lowcost=0;
for(j=0;j<G.vexnum;++j)
if(G.arcs[k][j].adj<closedge[j].lowcost)
{
closedge[j].adjvex=k;
closedge[j].lowcost=G.arcs[k][j].adj;
}
}

}
void main()
{
MGraph G;
G.vexnum=6;
int i,j;
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=65536;
G.arcs[0][1].adj=G.arcs[1][0].adj=6;
G.arcs[0][3].adj=G.arcs[3][0].adj=5;
G.arcs[0][2].adj=G.arcs[2][0].adj=1;
G.arcs[1][2].adj=G.arcs[2][1].adj=5;
G.arcs[1][4].adj=G.arcs[4][1].adj=3;
G.arcs[2][4].adj=G.arcs[4][2].adj=6;
G.arcs[2][5].adj=G.arcs[5][2].adj=4;
G.arcs[3][5].adj=G.arcs[5][3].adj=2;
G.arcs[4][5].adj=G.arcs[5][4].adj=6;
G.arcs[2][3].adj=G.arcs[3][2].adj=5;
MiniSpanTree_PRIM(G,0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: