您的位置:首页 > 其它

Prim算法求最小生成树

2012-05-17 23:09 239 查看
作者:silence、2012年5月17日

本文参考:Google,数据结构(C语言)

本人声明:个人原创,转载请注明出处。

prim算法,求最小生成树
#include <cstdlib>
#include <iostream>
/*
最小生成树prim
*/
#define Max 65535
using namespace std;
struct Graph
{
int arrArc[200][200];
int verCount;
int arcCount;
} ;
int prim(Graph *g)
{    int sum = 0;
int flag[200];//表示n是否加入S集合
int dis[200];//表示n到源点的最近距离
for(int i = 0;i<g->verCount;i++)
{
dis[i] = g->arrArc[0][i];
flag[i] = 0;
}
flag[0] = 1; //将0号结点加入集合S
int count = 0;
while(count++< g->verCount-1){//余下的点
int min = Max;
int select;
for(int i = 0;i<g->verCount;i++)
{
if((flag[i]==0)&&(min>dis[i]))
{
min = dis[i];
select = i;
}
}
sum+=min;
flag[select] = 1;
for(int i = 0;i<g->verCount;i++)
{
if((flag[i]==0)&&(g->arrArc[select][i]<dis[i]))
{
dis[i] = g->arrArc[select][i];
}

}
}
return sum;
}
int main(int argc, char *argv[])
{
Graph g;
cout<<"input the ver and arc"<<endl;
cin>>g.verCount>>g.arcCount;

for(int i = 0;i<g.verCount;i++)
for(int j =0 ;j<g.verCount;j++)
{
if(i==j) g.arrArc[i][i]=0;
else
g.arrArc[i][j] = Max;
}
char a,b;
int dis;
cout<<"input the arrArc"<<endl;

for(int k = 0;k<g.arcCount;k++)
{
cin>>a>>b>>dis;
int i = a - 'A';
int j = b - 'A';
g.arrArc[i][j] = dis;
g.arrArc[j][i] = dis;
}
cout<<"the min value is "<<prim(&g)<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
/*
输入
7 11
A B 7
A D 5
B C 8
B D 9
B E 7
C E 5
D E 15
D F 6
E F 8
E G 9
F G 11

输出
39

无向加权图中,n个顶点的最小生成树有n-1条边,这些边使得n个顶点之间可达,且总的代价最小。
prim算法是一种贪心算法,将全部的顶点划分为2个集合,每次总在2个集合之间中找最小的一条边,局部最优最终达到全局最优,这正是贪心的思想
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: