prim算法的思想类似于求最短路dijkstra算法:
跟dijkstra算法相似,也是将点分成两组,一组是已经加入到最小生成树中的点,一组是待加入的点,用一个low[maxsize]数组表示达到每个点的最短距离,然后每加入
到生成树中一个点,就要对low[maxsize]进行松弛操作。
附上一点裸的oj题目:
AC代码
#include<iostream>
#include<string>
#include<string.h>
#define maxsize 100000000
using namespace std;
int n,map[110][110],low[110],s,d,x;
bool check[110];
int prim()
{
int ans=0;
memset(check,false,sizeof(check));
check[1]=true;
low[1]=0;
for(int i=2;i<=n;i++)
{
low[i]=map[1][i];
}
for(int i=1;i<n;i++)
{
int min=maxsize;
int pos;
for(int j=1;j<=n;j++)
{
if(!check[j]&&low[j]<min)
{
min=low[j];
pos=j;
}
}
ans=ans+min;
check[pos]=true;
for(int j=1;j<=n;j++)
{
if(!check[j]&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
}
return ans;
}
int main()
{
while(cin>>n)
{
if(n==0)
break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=maxsize;
for(int i=1;i<=n*(n-1)/2;i++)
{
cin>>s>>d>>x;
if(map[s][d]>x)
map[s][d]=map[d][s]=x;
}
cout<<prim()<<endl;
}
return 0;
}