最小生成树-普利姆算法

详细的说明代码中已经差不多了,不再赘述:
用到的图如下:
最小生成树-普利姆算法_第1张图片
#include 
#include 
typedef struct e{
    int otherVertex;//保存另一条边的标号
    int edgeWeight;//保存另一条边的权重
} Edge;
void prim(int *edge,int vertexNum);
int main(){
    puts("***************普利姆算法(求连通图分最小生成树)****************");
    puts("***************************************************************");
    puts("最小生成树:包括n各顶点,但是只有n-1个边的一棵树,想要使权值相加为最小.");
    //这里把图写死了,只是为了实现这个算法
    int edge[6][6]={0};
    int i ,j;
    edge[0][1] = 6;
    edge[0][2] = 1;
    edge[0][3] = 5;
    edge[1][2] = 5;
    edge[2][3] = 5;
    edge[2][5] = 4;
    edge[1][4] = 3;
    edge[2][4] = 6;
    edge[3][5] = 2;
    edge[4][5] = 6;

    edge[1][0] = 6;
    edge[2][0] = 1;
    edge[3][0] = 5;
    edge[2][1] = 5;
    edge[3][2] = 5;
    edge[5][2] = 4;
    edge[4][1] = 3;
    edge[4][2] = 6;
    edge[5][3] = 2;
    edge[5][4] = 6;
    prim(edge,6);
    return 0;
}

void prim(int *edge,int vertexNum){
    Edge *closeEdge;
    int i;
    closeEdge = (Edge *)malloc(sizeof(Edge)*vertexNum); //候选集合中的点到生成树中的点的一组最小边
    //顶点集合的下标代表一个顶点的标号 如果而值1代表改点存在该集合中0代表该点不存在该集合
    int *U = (int *)malloc(sizeof(int)*vertexNum);//生成树顶点集合
    int *S_U = (int *)malloc(sizeof(int)*vertexNum);//候选集合顶点 它和U集合的顶点是互补的
    //初始化U集合和S_U集合
    U[0]= 1;//将0标号这个点放入集合中
    S_U[0] = 0;//将0标号的点移除S_U集合
    for(i = 1;i
输出结果如下:
***************普利姆算法(求连通图分最小生成树)****************
***************************************************************
最小生成树:包括n各顶点,但是只有n-1个边的一棵树,想要使权值相加为最小.
(1,3);(3,6);(6,4);(3,2);(2,5);
输出closeEdge:
(1,1),权重:0;(3,2),权重:5;(1,3),权重:1;(6,4),权重:2;(2,5),权重:3;(3,6),权重:4;

 

你可能感兴趣的:(算法)