最小生成树 Prim算法实现
最近帮辩论队的学妹写道程序 要用到最小生成树,用Prim算法实现记录如下:
题目:
已知一个无向图的G=(V,E)的邻接矩阵W,现要求找一条经过每一个顶点的路,该路的总权最短。
实现代码如下:
<span style="font-size:14px;">/*
*图的最小生成树
*使用Prim算法实现
*2015/11/29于中国矿业大学
*/
#include<iostream>
using namespace std;
int g[6][6] = {//待查找最短路线的图的存储
0,56,35,2,51,60,
56,0,21,57,78,70,
35,21,0,36,68,68,
2,57,36,0,51,61,
51,78,68,51,0,13
};
int visited[6];//用于标记点是否访问过
int lowcost[6];//用于记录点间最小权重
int path[6];//记录构造过程即路径
int Prim(int start)//Prim算法实现 start表示开始的点
{
path[0] = start;//路径记录开始的点
int pos = 0;//用于记录最小权重对应的位置
visited[start] = 1;//从start点开始,标记1表示已访问
int count = 0;//count表示边的个数,用于判定是否构造路径结束
int result = 0;//用于记录最小权值和
int j;
for(j=0;j<6;j++)
lowcost[j] = g[start][j];
while(count<5)//6个点最终需要5条路径
{
int min = 999;
for(j=0;j<6;j++)//查询最小权重
{
if(visited[j]!=1 && min>lowcost[j])
{
min = lowcost[j];
pos = j;
}
}
result += min;//权重相加
visited[pos] = 1;//新加入点
count++;//表示新加入一条边
path[count] = pos;
for(j=0;j<6;j++)//更新最小权重
{
if(visited[j]!=1 && lowcost[j]>g[pos][j])
lowcost[j]=g[pos][j];
}
}
return result;
}
int main()
{
cout<<Prim(1)<<endl;//无论从哪个点开始结果是一样的只是构造过程的点的顺序不同但全局来看路径是相同的
int i;
for(i=0;i<6;i++)//根据开始的点不同,构造过程不同
cout<<path[i]+1<<" ";
cout<<endl;
return 0;
}</span>