zoukankan      html  css  js  c++  java
  • 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
    */
  • 相关阅读:
    [IOS]《A Swift Tour》翻译(一)
    Android Property Animation动画
    [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持
    使用spin.js优化等待ajax返回时的页面效果
    用adb命令组装PowerShell实用小工具——Android测试小助手
    测试团队专业化建设规范建议与素质养成指南
    用Python脚本在豆瓣音乐人小站上下载未开放下载的歌曲
    Java调用Python脚本工具类
    Python爬网——获取安卓手机统计数据
    JIRA REST java client API实际应用
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2752608.html
Copyright © 2011-2022 走看看