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
*/

 

 

posted on 2012-11-03 14:26  IThinktan  阅读(1560)  评论(1编辑  收藏  举报

导航