prim算法是具有动态规划思想的最小生成树算法,在NOIP中十分重要;
参考代码:
<span style="font-size:18px;">#include<iostream>
#include<algorithm>
using namespace std;
const int N=10005;
int g[N][N],n,closedge[N],ans(0);
int min(){
int k,min=0x7fffff;
for (int i=0;i<n;i++)
if (closedge[i]&&closedge[i]<min){
min=closedge[i];
k=i;
}
return k;
}
void mst(int x){
for (int i=0;i<n;i++) closedge[i]=g[x][i];
int v;
for (int i=1;i<n;i++){
v=min();
ans+=closedge[v];
closedge[v]=0;
for (int j=0;j<n;j++)
if (closedge[j]&&g[v][j]<closedge[j])
closedge[j]=g[v][j];
}
}
int main()
{
int m;
cin>>n>>m;
memset(g,0x7f,sizeof(g));
for (int i=0;i<n;i++) g[i][i]=0;
for (int i=0,begin,end,wei;i<m;i++){
cin>>begin>>end>>wei;
g[begin][end]=g[end][begin]=wei;
}
mst(0);
cout<<ans<<endl;
return 0;
}</span>
注意代码中并没有考虑无法生成树的情况,考虑这种情况时只需在mst函数中加一个变量num在ans前后统计节点数,然后与总结点数比较即可。