• 最小生成树


    /*********************************************
    ****************prim算法**********************
    **********************************************/
    void MiniSpanTree_Prim(MGraph G)
    {
        int min, i, j, k;
        int adjvex[MAXVEX];      //保存相关顶点下标
        int lowcost[MAXVEX];       //保存相关顶点间边的权值
        
        lowcost[0] = 0;             //V0作为最小生成树的根开始遍历, 权值为0
        adjvex[0] = 0;              //V0第一个加入
    
        //初始化操作
        for (i=1; i<G.numVertexes; i++)
        {
            lowcost[i] = G.arc[0][i];       // 将邻接矩阵第0行所有权值先加入数组
            adjvex[i] = 0;                  //  初始化全部先为VO的下标
        }
        
        //生成最小生成树全过程
        for (i=1;i < G.numVertexes; i++)
        {
            min = INFINITY;    //初始化为不可能的值
            j = 1;
            k = 0;
    
            //遍历全部顶点
            while ( j < G.numVertexes)
            {
                //找出lowcost已存储的最小值
                if ( lowcost[j]!=0 && lowcost[j]<min)
                {
                    min = lowcost[j];
                    k = j;
                }
                j++;
            }
    
            //打印当前最小的边
            printf("(%d %d)", adjvex[k], k);
            lowcost[k] = 0;
    
            //邻接矩阵k行逐个遍历全部顶点
            for (j=1;j < G.numVertexes; j++)
            {
                if (lowcost[j]!=0 && G.arc[k][j]<lowcost[j])
                {
                    lowcost[j] = G.arc[k][j];
                    adjvex[j] = k;
                }
            }
        }
    }
    /*****************************************
    ******************************************
    ***************Kruskal算法****************
    ******************************************
    *****************************************/
    
    int Find (int *parent, int f)
    {
        while (parent[f] > 0)
        {
            f = parent[f];
        }
        
        return f;
    }
    
    void MiniSpanTree_Kruskal (MGraph G)
    {
        int i, n, m;
        Edge edges[MAGEDGE];    //定义边集数组
        int parent[MAXVEX];     //定义parent数组用来判断边与边是否形成环路
        
        for (i=0;i<G.numEdges;i++)
        {
            parent[i] = 0;
        }
        
        for (i=0;i<G>numEdges;i++)
        {
            n = Find(parent, edges[i].begin);
            m = Find(parent, edges[i].end);
            
            if (n!=m)           //如果n==m 则形成环路 不满足
            {
                parent[n] = m;  //将此边的结尾顶点放入下标为起点的parent数组中,表示此顶点已经在生成树中
                printf("(%d %d) %d" edges[i].begin, edges[i].end, edges[i].weight);
            }
        }
    }
  • 相关阅读:
    类和对象
    类和对象1
    常见的子串问题
    常见的算法问题全排列
    第六届蓝桥杯java b组第五题
    第六届蓝桥杯java b组第四题
    第六届蓝桥杯java b组第三题
    第六届蓝桥杯java b组第二题
    第六届蓝桥杯java b组第一题
    第八届蓝桥杯java b组第三题
  • 原文地址:https://www.cnblogs.com/Kingpenguin/p/9977187.html
Copyright © 2020-2023  润新知