大意是Farmer John有几块农场,他要把农场连接起来,问最短长度是多少。
最小生成树问题,prim水过。。。然后WA了三次,错在一个很无聊的地方。。。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int inf=0x3f3f3f3f;
int n,ans;
int mm[105][105];
int dis[105];
bool had[105];
void prim(){
memset(had,0,sizeof(had));
for(int i=1;i<=n;i++){
dis[i]=mm[1][i];
}
had[1]=1;
for(int i=1;i<=n-1;i++){
int m=0;
for(int j=1;j<=n;j++){
if(had[j]) continue;
if(!m && dis[j]) m=j;
else if(dis[m]>dis[j]) m=j;
}
ans+=dis[m];
had[m]=1;
for(int j=1;j<=n;j++){
if(!had[j] && dis[j]>mm[m][j]){
dis[j]=mm[m][j];
}
}
}
}
int main(){
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mm[i][j];
}
}
ans=0;
prim();
cout<<ans<<endl;
}
return 0;
}