想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离
解题思路:又是一个最小生成树,因为给出了一个二维矩阵代表他们的距离,直接算prim就行了
/*
prim
Memory 204K
Time 16MS
*/
#include <iostream>
using namespace std;
#define MAXV 101
#define inf 1<<29
int map[MAXV][MAXV],n;
void prim(){
int i,j,d[MAXV],vis[MAXV],mi,v;
for(i=1;i<=n;i++){
d[i]=map[1][i];
vis[i]=0;
}
for(i=1;i<=n;i++){
mi=inf;
for(j=1;j<=n;j++)
if(!vis[j] && d[j]<mi){
mi=d[j];
v=j;
}
vis[v]=1;
for(j=1;j<=n;j++)
if(!vis[j] && d[j]>map[v][j])
d[j]=map[v][j];
}
for(d[0]=0,i=1;i<=n;i++) d[0]+=d[i];
printf("%d\n",d[0]);
}
int main(){
int i,j;
while(~scanf("%d",&n)){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
prim();
}
return 0;
}