• hdu 4081 Qin Shi Huang's National Road System


    思路: 建立最小生成树的图,之后进行枚举边(两点)。然后去掉原来生成树上的边。 去掉一条遍之后,原图为两棵树。

    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
    ",ans);
    104 }
    105 
    106 int main()
    107 {
    108     cin >> T;
    109     while (T--) {
    110         run();
    111     }
    112     return 0;
    113 }
  • 相关阅读:
    转载【工具】目前几种常见的线上接口文档管理平台的比较
    最好的Julia语言
    称霸Kaggle的十大深度学习技巧
    AI以假乱真怎么办?TequilaGAN教你轻松辨真伪
    2018 CISCN reverse
    2018 CISCN Writeup
    加壳&脱壳
    脱upx壳--初试--单步追踪
    Linux
    hackme.inndy.tw
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4342922.html
Copyright © 2020-2023  润新知