题目描述
最小生成树问题是实际生产生活中十分重要的一类问题。假设需要在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