Prim算法求最小生成树

数据结构书P189---图7.34

#include <stdio.h>

#define    MAXV 100  //最大顶点个数

#define INF 32767 //INF表示∞

typedef struct                  

{      int edges[MAXV][MAXV];//邻接矩阵

       int vexnum,arcnum;   //顶点数,弧数

} MGraph;//图的邻接矩阵类型



void init(MGraph &g);//初始化邻接矩阵

void DispMat(MGraph g);//输出邻接矩阵g

void prim(MGraph g,int v);

int main()

{

    int u=3;

    MGraph g;//图的邻接矩阵

    init(g);//初始化邻接矩阵

    printf("图G的邻接矩阵:\n");

    DispMat(g);

    printf("\n");

    printf("普里姆算法求解结果:\n");

    prim(g,0);

    printf("\n");

    return 0;

}





void prim(MGraph g,int v)//从v号节点开始---生成最小生成树

{

    //(V-U)---未加入最小生成树的点

    //U---已加入最小生成树的点

    int i,j,k;

    int MinCost[MAXV];   //(V-U)中各点离U的最小距离

    int MinCostNum[MAXV];//(V-U)中各点离U的最小距离对应在U中的点

    int min;//min记录离U最近的距离

    MinCost[v]=0;//v加入U

    for (i=0;i<g.vexnum;i++) //初始化MinCost[]和MinCostNum[]

    {    

        MinCost[i]=g.edges[v][i];//每个节点距v的值

        MinCostNum[i]=v;//(V-U)中的节点i距U中最近的点是v

    }

    for (i=1;i<g.vexnum;i++)          

    {   

        min=INF;

        for (j=0;j<g.vexnum;j++)//在(V-U)中找出离U最近的顶点k

               if (MinCost[j]!=0 && MinCost[j]<min) //未加入U(即V-U)中的点且距离U最近

            {    

                min=MinCost[j];

                k=j; //k记录离U最近的顶点

            }

            if(min!=INF)//(V-U)中离U最近点k--距U中最近的一个点是MinCostNum[k]

                printf("边(%d,%d)权为:%d\n",MinCostNum[k],k,min);

            MinCost[k]=0;//标记k已经加入U

            //更新(V-U)中的点/////////////////////

            for (j=0;j<g.vexnum;j++)//由于顶点k的新加入而修改数组lowcost和closest

                   if (MinCost[j]!=0 && g.edges[k][j]<MinCost[j]) 

                {    

                    MinCost[j]=g.edges[k][j];

                    MinCostNum[j]=k; 

                }

            /////////////////////////////////////////

    }

}

void init(MGraph &g)

{

    int i,j;

    g.vexnum=6;g.arcnum=10;

    int A[MAXV][11];    

    for (i=0;i<g.vexnum;i++)

        for (j=0;j<g.vexnum;j++)

            A[i][j]=INF;

    //数据结构书P189---图7.34

    A[0][2]=10;A[0][4]=30;A[0][5]=100;

    A[1][2]=5;

    A[2][3]=50;

    A[3][5]=10;

    A[4][3]=20;A[4][5]=60;

    /*for (i=0;i<g.vexnum;i++)//使邻接矩阵对称

        for (j=0;j<g.vexnum;j++)

            A[j][i]=A[i][j];*/

    for (i=0;i<g.vexnum;i++)//建立邻接矩阵

        for (j=0;j<g.vexnum;j++)

            g.edges[i][j]=A[i][j];



}

void DispMat(MGraph g)//输出邻接矩阵g

{

    int i,j;

    for (i=0;i<g.vexnum;i++)

    {

        for (j=0;j<g.vexnum;j++)

            if (g.edges[i][j]==INF)

                printf("%3s","");

            else

                printf("%3d",g.edges[i][j]);

        printf("\n");

    }

}

/*

图G的邻接矩阵:

 ∞ ∞ 10 ∞ 30100

 ∞ ∞  5 ∞ ∞ ∞

 ∞ ∞ ∞ 50 ∞ ∞

 ∞ ∞ ∞ ∞ ∞ 10

 ∞ ∞ ∞ 20 ∞ 60

 ∞ ∞ ∞ ∞ ∞ ∞

普里姆算法求解结果:

边(0,2)权为:10

边(0,4)权为:30

边(4,3)权为:20

边(3,5)权为:10

*/

 

 

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