1. 程式人生 > >hdu-1162 Eddy's picture---浮點數的MST

hdu-1162 Eddy's picture---浮點數的MST

targe print std scanf truct n) pro bsp def

題目鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=1162

題目大意:

給n個點,求MST權值

解題思路:

直接prim算法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 100 + 10;
 5 const int INF = 1e9 + 7;
 6 double Map[maxn][maxn];
 7 double lowcost[maxn];
 8 int mst[maxn];
 9 int n, m;
10 double prim(int u) 11 { 12 double ans = 0; 13 for(int i = 1; i <= n; i++) 14 { 15 lowcost[i] = Map[u][i]; 16 mst[i] = u; 17 } 18 mst[u] = -1; 19 for(int i = 1; i < n; i++) 20 { 21 double minn = INF * 1.0; 22 int v = -1; 23 //尋找lowcost數組裏面的未加入mst的最小值
24 for(int j = 1; j <= n; j++) 25 { 26 if(mst[j] != -1 && lowcost[j] < minn) 27 { 28 v = j; 29 minn = lowcost[j]; 30 } 31 } 32 if(v != -1) 33 { 34 mst[v] = -1; 35 ans += lowcost[v];
36 for(int j = 1; j <= n; j++) 37 { 38 if(mst[j] != -1 && lowcost[j] > Map[v][j]) 39 { 40 lowcost[j] = Map[v][j]; 41 mst[j] = v; 42 } 43 } 44 } 45 } 46 printf("%.2f\n", ans); 47 } 48 struct node 49 { 50 double x, y; 51 }a[maxn]; 52 double dis(node a, node b) 53 { 54 return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 55 } 56 int main() 57 { 58 while(scanf("%d", &n) != EOF) 59 { 60 for(int i = 1; i <= n; i++) 61 for(int j = 1; j <= n; j++)Map[i][j] = INF * 1.0; 62 memset(lowcost, 0, sizeof(lowcost)); 63 for(int i = 1; i <= n; i++) 64 { 65 scanf("%lf%lf", &a[i].x, &a[i].y); 66 } 67 for(int i = 1; i <= n; i++) 68 { 69 for(int j = i + 1; j <= n; j++) 70 { 71 double d = dis(a[i], a[j]); 72 Map[i][j] = Map[j][i] = d; 73 } 74 } 75 prim(1); 76 77 } 78 return 0; 79 }

hdu-1162 Eddy's picture---浮點數的MST