POJ2560 Prim
问题:
存在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); }