好久没写过最小生成树的题了....练下手看生了没有= =
题目链接:http://poj.org/problem?id=1258
模板就不多说了,裸的prim
#include <iostream>
#include <string.h>
using namespace std;
#define maxx 0x3f3f3f3f;
int n,map[111][111],low[111],v[111];
int prim(){
int ans=0,i,j;
int p;
v[1]=1; //从第一点开始,标记并记录;
p=1;
for(i=1;i<=n;i++){
if(i!=p)
low[i]=map[p][i]; //low数组第一次赋值
}
for(i=1;i<n;i++){
int min=maxx;
for(j=1;j<=n;j++){ //找到当前标记点的最小权值
if(v[j]==0&&min>low[j]){
min=low[j];
p=j;
}
}
ans+=min; //答案累加
v[p]=1; //标记该点
for(j=1;j<=n;j++){ //更新权值
if(v[j]==0&&low[j]>map[p][j])
low[j]=map[p][j];
}
}
return ans;
}
int main (){
while(cin>>n){
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j];
int ans=prim();
cout<<ans<<endl;
}
return 0;
}