zoukankan      html  css  js  c++  java
  • HDU ACM 1875 畅通工程再续(MST)

    畅通工程再续

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

    Total Submission(s): 8450    Accepted Submission(s): 2573

    Problem Description
    相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
     
    Input
    输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。 每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
     
    Output
    每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
     
    Sample Input
    2 2 10 10 20 20 3 1 1 2 2 1000 1000
     
    Sample Output
    1414.2 oh!
     
    Author
    8600
     
    Source
     
    Recommend
    lcy
     
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define MAXN 1002 
    double path[102][102];
    int flag[102];
    double closedge[102];
    double cnt;
    
    typedef struct{
        int x, y;
    }input;
    
    input temp[102];
    
    double calculate(int x1, int y1, int x2, int y2)
    {// 两点之间的距离 
        double t = (double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        return sqrt(t);
        
    }
    
    double CreatMST(int n)
    {
        int i, j, x;
        double k;
        flag[0] = 1;
        for(i=1; i<n; ++i)
        closedge[i] = path[0][i];
        for(i=1; i<n; ++i)
        {
            k = MAXN-2, x = 0;
            for(j=0; j<n; ++j)
            if(!flag[j] && closedge[j] <= k)
                x = j, k = closedge[j];
            flag[x] = 1;
            cnt += k;
            for(j=0; j<n; ++j)
            if(!flag[j] && closedge[j] > path[x][j])
            closedge[j] = path[x][j];
        }
        return cnt;
    }
    
    int main()
    {
        int i, j, k, t, x, y, n, m, T, fflag;
        double h;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d", &n);
            cnt = 0;
            memset(temp, 0, sizeof(input)*102);
            memset(flag, 0, sizeof(flag));
            memset(closedge, 0, sizeof(closedge));
            memset(path, 0, sizeof(double)*102*102);
            for(i=0; i<n; ++i)
            scanf("%d%d", &temp[i].x, &temp[i].y);
            
            // 计算N*(N+1)条路径的权重 
            for(i=0; i<n; ++i)
            for(j=0; j<n; ++j)
            {
                h = calculate(temp[i].x, temp[i].y, temp[j].x, temp[j].y);
                if(h < 10 || h > 1000) path[i][j] = MAXN;  // 处理掉不属于范围内的路径 
                else path[i][j] = h;
            }
            if(n == 1 || n == 0) {printf("oh!\n"); continue;}  // 特殊的情况先判断 
            h = CreatMST(n)*100;
            fflag = 0;
            for(i=0; i<n; ++i) if(flag[i] == 0) {fflag = 1; break;} // 如果还有小岛未归纳进去,说明工程未完成 
            if(fflag) printf("oh!\n");
            else printf("%.1lf\n", h);
        }
        return 0;
    }


    解题思路:

    1WA:未考虑到特殊的情况的出现(这里说的是当n=0 || n = 1的情况)

    其实代码还可以更简洁的,比如说处理掉不属于范围内的路径这不可以不要,直接在构造最小生成树时判断,判断最后是否有小岛未归并进去可以根据x 是否等于 0 直接判断返回

  • 相关阅读:
    01 mybatis框架整体概况(2018.7.10)-
    第一课(2018.7.10)
    JavaEE 企业级分布式高级架构师课程_汇总贴
    5-1条件运算符 & 5-2
    5-3运算符的优先级
    4-3逻辑非运算符及案例 & 4-4
    4-1逻辑与运算符介绍 & 4-2逻辑或运算符介绍
    3-3if-else条件结构 & 3-4 & 3-5
    3-2if条件结构
    3-1关系运算符
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/2820897.html
Copyright © 2011-2022 走看看