问题:
存在n个点,已知这些点的坐标,求出这些点的最小生成树(minimal spanning tree)的权重。
算法:
Prim:1.任选一个点,加入树中,作为第一个树中的点。
2.取距离现有树距离最小的点,加入树中。
3.重复步骤2, 直至所有点都加入到树中。
注意点:1.已处理点与未处理点的表示与转换。
代码:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cfloat>
#include<vector>
using namespace std;
double cost[100][100];
typedef struct{
double x;
double y;
} point;
double calCost(point a, point b){
return pow(pow(a.x - b.x, 2) + pow(a.y - b.y, 2), 0.5);
}
int main(){
int N;
point dot[100];
cin >> N;
for(int i = 0; i < N; i++){
cin >> dot[i].x >> dot[i].y;
}
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
if(i == j)
cost[i][j] = DBL_MAX;
else
cost[i][j] = calCost(dot[i], dot[j]);
/* for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++)
cout << cost[i][j] << " ";
cout << endl;
}
*/
int ele = 1;
double costTotal = 0;
vector<int> span;
span.push_back(0);
while(ele != N){
double minCost = DBL_MAX;
int index;
for(int i = 0; i < span.size(); i++){
for(int j = 0; j < N; j++){
if(cost[span[i]][j] < minCost){
minCost = cost[span[i]][j];
index = j;
}
}
}
// cout << minCost << " " << index << endl;
span.push_back(index);
costTotal += minCost;
ele++;
for(int i = 0; i < span.size(); i++)
for(int j = 0; j < span.size(); j++){
cost[span[i]][span[j]] = DBL_MAX;
cost[span[j]][span[i]] = DBL_MAX;
}
}
printf("%.02f",(float)costTotal);
}
615

被折叠的 条评论
为什么被折叠?



