您的位置:首页 > 其它

最小生成树算法 prim算法

2014-06-07 10:53 197 查看
最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),
同时还要考虑使树的权最小。 prim算法就是一种最小生成树算法。

普里姆算法的基本思想:

从连通网N={V,E}中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U中。如此继续下去,直到网中的所有顶点都加入到生成树顶点集合U中为止。

下面举例说明下prim算法:













例题:poj 2485

#include <iostream>
using namespace std;

#define INF 70000

int N;//点的数目
int key[500];
bool flag[500];
int A[500][500];

int Prim(int r)
{
int result=0;
for(int i=0;i<N;i++)
{
key[i]=INF;
flag[i]=true;
}
key[r]=0;
for(int i=0;i<N;i++)
{
int min_num=INF;
int min;
for(int j=0;j<N;j++)
{
if(flag[j] && min_num>key[j])
{
min_num=key[j];
min=j;
}
}
flag[min]=false;
if(result<key[min])
result=key[min];
for(int j=0;j<N;j++)
{
if(flag[j] && A[min][j] < key[j])
key[j]=A[min][j];
}
}
return result;
}

int main()
{
int T;
cin >> T;
while(T--)
{
cin >> N;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
scanf("%d",&A[i][j]);
}
cout << Prim(0) << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 图论 prim