prim算法:
第一步:先任意选择一个点作为 最小生成树 的起始点。
第二步:然后找出所有点中 到 最小生成树 的最小距离的点。又加入最小生成树
第三步:然后再更新 所有点 到最小生成树的 距离。
再重复第二三步。一直到n个点都被加入进来了。
例题:hdu 1102
#include<iostream>
#include<cstdio>
using namespace std;
#define INF 0x1f1f1f1f//定义一个整数常量,表示无穷大
//prim函数返回得到的最小生成树的n-1条边的权值和
//参数cost 为表示图的矩阵,n为顶点个数
int prim(int cost[][200],int n)
{
//low表示每个点到生成树的最小距离,vis表示一个点是否已加入生成树中
int low[10000],vis[10000]={0};
int i,j,p;
int min,res=0;
vis[0]=1;
for(i=1;i<n;i++)low[i]=cost[0][i];
for(i=1;i<n;i++)
{
min=INF;p=-1;
for(j=0;j<n;j++)
{
if(0==vis[j]&&min>low[j])
{
min=low[j];
p=j;
}
}
//min==INF说明找不到能够加入的点了,说明图是不连通的
if(min==INF)return -1;
res+=min;
vis[p]=1;
for(j=0;j<n;j++)
{
if(0==vis[j]&&low[j]>cost[p][j])
{
low[j]=cost[p][j];
}
}
}
return res;
}
int main()
{
int n;
int a[200][200];
while(cin>>n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
int q;
scanf("%d",&q);
for(int i=0;i<q;i++)
{
int u,v;
scanf("%d%d",&u,&v);
a[u-1][v-1]=a[v-1][u-1]=0;
}
int res=prim(a,n);
printf("%d\n",res);
}
return 0;
}