- 最小生成树Prime
例题:HDU 1162 Eddy’s picture
#include <cstdio>
#include <cmath>
#define INF 0x7ffffff
using namespace std;
typedef struct{
double x;
double y;
}point;
point p[105];
double map[105][105];
int n;
void prime(){
double sum = 0;
double lowcost[105] , min;
int idx , i , j ;
for(i = 0 ; i < n ; i ++){
lowcost[i] = map[0][i];
}
lowcost[0] = 0;
for(i = 1 ; i <= n-1 ; i ++){
min = INF;
for(j = 0 ; j < n ; j ++){
if(lowcost[j] < min && lowcost[j]){
min = lowcost[j];
idx = j;
}
}
sum = sum + min;
lowcost[idx] = 0;
for(j = 0 ; j < n ; j ++){
if(map[idx][j] < lowcost[j] && lowcost[j]){
lowcost[j] = map[idx][j];
}
}
}
printf("%.2lf\n",sum);
}
int main(){
while(scanf("%d",&n) != EOF){
for(int i = 0 ; i < n ; i ++){
scanf("%lf %lf",&p[i].x , &p[i].y);
}
for(int i = 0 ; i < n ; i ++){
for(int j = 0 ; j < n ; j ++){
if(i == j) map[i][j] = INF;
else
map[i][j] = sqrt((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y));
}
}
prime();
}
return 0;
}