zoukankan      html  css  js  c++  java
  • hdu-1875 畅通工程再续---MST

    题目链接:

    https://vjudge.net/problem/HDU-1875

    题目大意:

    相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。

    解题思路:

    hdu-1863类似,也是MST加连通

     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;
    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         else return -1.0;//没有找到,说明不连通
    46     }
    47     return ans;
    48 }
    49 struct node
    50 {
    51     int x, y;
    52 }a[maxn];
    53 double dis(node a, node b)
    54 {
    55     return sqrt(1.0 * (a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y));
    56 }
    57 int main()
    58 {
    59     int T;
    60     scanf("%d", &T);
    61     while(T--)
    62     {
    63         scanf("%d", &n);
    64         for(int i = 1; i <= n; i++)
    65             for(int j = 1; j <= n; j++)Map[i][j] = INF * 1.0;
    66         memset(lowcost, 0, sizeof(lowcost));
    67         for(int i = 1; i <= n; i++)
    68         {
    69             scanf("%d%d", &a[i].x, &a[i].y);
    70         }
    71         for(int i = 1; i <= n; i++)
    72         {
    73             for(int j = i + 1; j <= n; j++)
    74             {
    75                 double d = dis(a[i], a[j]);
    76                 if(d < 10 || d > 1000)continue;
    77                 Map[i][j] = Map[j][i] = d;
    78             }
    79         }
    80         double ans = prim(1);
    81         if(ans > 0)printf("%.1f
    ", ans * 100);
    82         else printf("oh!
    ");
    83     }
    84     return 0;
    85 }
  • 相关阅读:
    Android布局
    Android单位度量
    mysql操作1
    mysql操作
    Android Bitmap 开源图片框架分析(精华五)
    Android Bitmap 图片框架效果处理对比(精华六)
    Android Bitmap 开源图片框架分析(精华四)
    Android Bitmap 开源图片框架分析(精华三)
    Android Bitmap 加载多张图片的缓存处理(精华二)
    Android Bitmap 加载大尺寸图片(精华一)
  • 原文地址:https://www.cnblogs.com/fzl194/p/8900254.html
Copyright © 2011-2022 走看看