知识点:
1、图的邻接矩阵表示法;
2、Prim算法实现
// MiniCostSpanTree_Prim.cpp
//基于图的邻接矩阵表示法
//图的最小生成树Prim算法
//逐个顶点的找出最小生成树
#include <iostream>
using namespace std;
#define max_vertex_num 20
int vex_num;//顶点个数
char v[max_vertex_num];//存储顶点
int arcs[max_vertex_num][max_vertex_num];//存储权值
void Initialization();//图的初始化
int LocateVex(char u);//定位顶点u,返回顶点在一维数组v中的下标
void InsertVex(char s);//插入顶点
void SetWeight(int u,int v,int w);//设置权值
void SetWeight(char u,char v,int w);//设置权值
void Prim(char firstvex);//Prim算法
int main(int argc, char* argv[])
{
Initialization();//图的初始化
//下面通过插入顶点和插入边,构造图
InsertVex('a');InsertVex('b');InsertVex('c');
InsertVex('d');InsertVex('e');InsertVex('f');
SetWeight('a','b',6);
SetWeight('a','c',5);
SetWeight('a','d',5);
SetWeight('b','c',5);
SetWeight('b','e',3);
SetWeight('c','d',5);
SetWeight('c','e',6);
SetWeight('c','f',4);
SetWeight('d','f',2);
SetWeight('e','f',6);
//调用Prim算法,生成最小生成树
::Prim('a');
return 0;
}
void Initialization()
{//图的初始化
vex_num=0;//开始时,顶点个数为0
for(int i=1;i<max_vertex_num;i++)
for(int j=i;j<max_vertex_num;j++)
arcs[i][j]=arcs[j][i]=99999;//表示无穷大
}
void InsertVex(char s)
{//插入一个顶点(为简化,假设不重复)
vex_num++;
v[vex_num]=s;//vex_num同时代表最后一个顶点在数组v中的下标
}
//
int LocateVex(char u)
{//定位顶点u对应的下标
for(int i=1;i<=vex_num;i++)
{ if(v[i]==u) return i; }
return 0;
}
void SetWeight(int u, int v, int w)
{//设置边上的权值
arcs[u][v]=arcs[v][u]=w;
}
void SetWeight(char u, char v, int w)
{//设置边上的权值
SetWeight(LocateVex(u),LocateVex(v),w);
}
void Prim(char firstvex)
{
struct edge
{
int u;
int v;
int cost;
};
edge L[max_vertex_num];//数组L
int a;//firstvex对应的下标
a=LocateVex(firstvex);
int i,j;
///初始化
for(i=1;i<=vex_num;i++)
{
L[i].u=i;
L[i].v=a;
L[i].cost=arcs[i][a];
}
L[a].cost=0;
for(i=1;i<=vex_num-1;i++)//每次选择出一条边
{
//选择最小的边
int min=99999;
int m=0;//最小值的下标
for(int k=1;k<=vex_num;k++)
{
if(L[k].cost<min&&L[k].cost!=0)
{
min=L[k].cost;
m=k;
}
}
cout<<'('<<v[L[m].u]<<','<<v[L[m].v]<<')'<<endl;
L[m].cost=0;//更新L
for(j=1;j<=vex_num;j++)
{
if(L[j].cost>arcs[j][m])
{
L[j].v=m;
L[j].cost=arcs[j][m];
}
}
}
}