最小生成树(邻接矩阵或邻接表)

题目描述

最小生成树问题是实际生产生活中十分重要的一类问题。假设需要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然需要考虑这样一个问题,即如何在最节省经费的前提下建立这个通信网。

可以用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。现在,需要选择一棵生成树,使总的耗费最小。这个问题就是构造连通网的最小代价生成树,简称最小生成树。一棵生成树的代价就是树上各边的代价之和。

而在常用的最小生成树构造算法中,普里姆(Prim)算法是一种非常常用的算法。
在本题中,读入一个无向图的数据并存入邻接矩阵,然后用普里姆(Prim)算法建立最小生成树,并输出最小生成树的代价。


本题提供部分参考程序

输入

第一行:输入总顶点数n,总边数e,以空格隔开。其中n不超过50,e不超过1000。
第二行:输入n个顶点的名称(char类型)
随后输入e行:每行输入1条边依附的顶点及权值,如a b 5 

输出

先输出n-1行,对应构造的最小生成树的n-1条边,格式为“(边端点,边端点):边权值"
最后输出最小生成树的总代价值,格式为"minCost=总代价值"。请注意行尾输出换行。

#include <iostream>
#include <iomanip>
using namespace std;

#define Max 1000
#define MVNum 100         //最大顶点数
#define OK 1

typedef char VerTexType; //顶点信息
typedef int OtherInfo;    //和边相关的信息
typedef int ArcType;

//- - - - -图的邻接表存储表示- - - - -
typedef struct {
   int info;
   VerTexType vexs[MVNum];            //顶点表
   ArcType arcs[MVNum][MVNum];      //邻接矩阵
   int vexnum, arcnum;                //图的当前点数和边数
} Graph;

int LocateVex(const Graph &g, VerTexType v)
{
   //确定点v在G中的位置
   for(int i = 0; i < g.vexnum; ++i)
      if(g.vexs[i] == v)
         return i;
   return -1;
}//LocateVex


void CreateUDG(Graph &g)
{
   //采用邻接矩阵表示法,创建无向图G
   /****在此下面完成代码***************/
    int i,j,k,w;
    char v1,v2;
    cin>>g.vexnum>>g.arcnum;
    for(i=0;i<g.vexnum;i++)
    {
        cin>>g.vexs[i];
    }
    for(i=0;i<g.vexnum;i++)
    for(j=0;j<g.vexnum;j++)
    {
        if(i==j)g.arcs[i][j]=0;
        else g.arcs[i][j]=Max;
    }
    for(k=0;k<g.arcnum;k++)
    {
        cin>>v1>>v2>>w;
        i=LocateVex(g, v1);
        j=LocateVex(g, v2);
        g.arcs[i][j]=g.arcs[j][i]=w;
    }
   /***********************************/
}//CreateUDN

void mintree(Graph g,int ad[][MVNum],int n)
{
    int i,j,k,p,q,sum=0,m;
    p=0;q=0;
    ad[p][q]=Max;
    for( k=1; k<n; k++ )
    {     m = Max;
           for( i=0; i<n; i++ )
           {
                if( ad[i][i]==Max)
                {
                    for( j=1; j<n; j++ )
                    {
                        if( (ad[j][j]==0) && (ad[i][j]<m))
                        {
                            m = ad[i][j];   p = i;    q = j;
                        }
                    }
                }
            }
            cout<<"("<<g.vexs[p]<<","<<g.vexs[q]<<")"<<":"<<ad[p][q]<<endl;
            ad[q][q] = Max;
            sum+=ad[p][q];
    }
    cout<<"minCost="<<sum<<endl;
}

int main()
{
   Graph g;
   CreateUDG(g);
   mintree(g,g.arcs,g.vexnum);
   return 0;
}//main

样例输入 Copy

6 10
a b c d e f
a b 6
a c 1
a d 5
b c 5
b e 3
c d 5
c e 6
c f 4
d f 2
e f 6

样例输出 Copy

(a,c):1
(c,f):4
(f,d):2
(c,b):5
(b,e):3
minCost=15

猜你喜欢

转载自blog.csdn.net/qq_63306482/article/details/124855770