最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择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;
}
}