标签:
思路: 建立最小生成树的图,之后进行枚举边(两点)。然后去掉原来生成树上的边。 去掉一条遍之后,原图为两棵树。
A - 分别为两棵树中的最大人口和
B - 生成树边长之和减去一条生成树边的长度。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #include<climits> 11 #include<string.h> 12 #include<cmath> 13 #include<stdlib.h> 14 #include<vector> 15 #include<stack> 16 #include<set> 17 #define INF 1e7 18 #define MAXN 10010 19 #define maxn 1000010 20 #define Mod 1000007 21 #define N 1010 22 using namespace std; 23 typedef long long LL; 24 25 struct node{ 26 double x, y, num; 27 }p[N]; 28 double G[N][N], dis[N], A, B; 29 vector<int> vec[N]; 30 int vis[N]; 31 int T, n; 32 int x, y; 33 int pre[N]; 34 35 double getdis(node a, node b) 36 { 37 return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y)); 38 } 39 40 void prim() //对最小生成树建图 41 { 42 int now, pos; 43 double min; 44 for (int i = 1; i <= n; ++i) dis[i] = INF; 45 now = 1; 46 for (int i = 1; i < n; ++i) { 47 min = INF; 48 for (int j = 1; j <= n; ++j) { 49 if (dis[j] > G[now][j]) 50 dis[j] = G[now][j], pre[j] = now; 51 } 52 dis[now] = -1; 53 for (int j = 1; j <= n; ++j) { 54 if (dis[j] > 0 && min > dis[j]) 55 min = dis[j], pos = j; 56 } 57 vec[pre[pos]].push_back(pos); 58 vec[pos].push_back(pre[pos]); 59 B += min; 60 now = pos; 61 } 62 } 63 64 int dfs(int u, int fa) 65 { 66 int max_num = p[u].num; 67 int ret = u, tt; 68 for (int i = 0; i < vec[u].size(); ++i) { 69 int v = vec[u][i]; 70 if (v == fa) continue; 71 tt = dfs(v, u); 72 if (max_num < p[tt].num) 73 max_num = p[tt].num, ret = tt; 74 } 75 return ret; 76 } 77 78 void run() 79 { 80 cin >> n; 81 for (int i = 1; i <= n; ++i) 82 cin >> p[i].x >> p[i].y >> p[i].num; 83 for (int i = 1; i <= n; ++i) 84 for (int j = 1; j <= n; ++j) 85 { 86 if (i == j) continue; 87 G[i][j] = G[j][i] = getdis(p[i], p[j]); 88 } 89 for (int i = 0; i <= n; ++i) vec[i].clear(); 90 B = 0; 91 memset(pre,-1,sizeof(pre)); 92 prim(); 93 double ans = -1.0, res; 94 int t1, t2; 95 for (int i = 1; i <= n; ++i) 96 for (int j = 0; j < vec[i].size(); ++j) { 97 int v = vec[i][j]; 98 t1 = dfs(i, v); 99 t2 = dfs(v, i); 100 res = (p[t1].num + p[t2].num)/(B - G[i][v]); 101 if (res > ans) ans = res; 102 } 103 printf("%.2lf\n",ans); 104 } 105 106 int main() 107 { 108 cin >> T; 109 while (T--) { 110 run(); 111 } 112 return 0; 113 }
hdu 4081 Qin Shi Huang's National Road System
标签:
原文地址:http://www.cnblogs.com/usedrosee/p/4342922.html