【HDU1162】Eddy's picture(MST基础题)
很基础的点坐标MST,一不留神就AC了, - - !!
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cmath> 6 #include <cctype> 7 #include <algorithm> 8 #include <numeric> 9 #include <limits.h> 10 11 #define typec double 12 using namespace std; 13 14 const int inf = 0xffff; 15 const int V = 105; 16 int vis[V]; 17 typec lowc[V], Map[V][V], point[V][2]; 18 19 typec prim (typec cost[][V], int n) { 20 int i, j, p; 21 typec minc, res = 0; 22 memset(vis, 0, sizeof(vis)); 23 vis[0] = 1; 24 for (i = 1; i < n; ++ i) lowc[i] = cost[0][i]; 25 for (i = 1; i < n; ++ i) { 26 minc = inf; 27 p = -1; 28 for (j = 0 ; j < n; ++ j) { 29 if (0 == vis[j] && minc > lowc[j]) { 30 minc = lowc[j]; 31 p = j; 32 } 33 } 34 if (inf == minc) return -1; 35 res += minc; 36 vis[p] = 1; 37 for (j = 0 ; j < n; ++ j) { 38 if (0 == vis[j] && lowc[j] > cost[p][j]) { 39 lowc[j] = cost[p][j]; 40 } 41 } 42 } 43 return res; 44 } 45 46 double cal_dis (double x1, double y1, double x2, double y2) { 47 return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); 48 } 49 50 int main () { 51 int n; 52 while (~scanf("%d", &n)) { 53 54 for (int i = 0 ; i < n; ++ i) { 55 scanf("%lf %lf", &point[i][0], &point[i][1]); 56 } 57 58 for (int i = 0 ; i < V; ++ i) { 59 for (int j = 0; j < V; ++ j) { 60 if (i == j) Map[i][j] = 0; 61 else Map[i][j] = inf; 62 } 63 } 64 65 for (int i = 0; i < n; ++ i) { 66 for (int j = i + 1; j < n; ++ j) { 67 Map[i][j] = Map[j][i] = 68 cal_dis(point[i][0], point[i][1], point[j][0], point[j][1]); 69 } 70 } 71 72 //cout << prim(Map, n) << endl; 73 printf("%.2lf\n", prim(Map, n)); 74 } 75 return 0; 76 }