题意:给定一些点的坐标,求将所有点连通的最小长度。
思路:最小生成树的问题,因为给出的是点的坐标,所以要先处理一下,得到任意两点间的距离,将其存入邻接矩阵中,利用prim算法即可。
感想:prim算法的使用,关键还是在于理解算法,以及判定的条件。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int n;
double d[110],map[110][110],mmin;
const double inf=10000000;
double prim(){
int v[110]={0};
int i,k,m,t=1;
double sum=0;
v[t]=1;
d[t]=0;
for(k=2;k<=n;k++){
mmin=inf;
for(i=1;i<=n;i++)
if(v[i]!=1){
if(d[i]>map[t][i])
d[i]=map[t][i];
if(mmin>d[i]){
mmin=d[i];
m=i;
}
}
v[m]=1;
t=m;
sum+=d[m];
}
return sum;
}
int main(){
double a[110],b[110];
int i,j;
while(cin>>n){
for(i=1;i<=n;i++)
cin>>a[i]>>b[i];
for(i=1;i<=n;i++){
d[i]=inf;
for(j=1;j<=n;j++)
map[i][j]=inf;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
map[i][j]=map[j][i]=sqrt((a[i]-a[j])*(a[i]-b[j])+(b[i]-b[j])*(b[i]-b[j]));
}
printf("%.2lf\n",prim());
}
return 0;
}