zoukankan      html  css  js  c++  java
  • 【杭电】[1875]畅通工程再续

    这里写图片描述
    这里写图片描述

    这一题也是做的不容易……
    思路是把坐标再计算回每一个点对应的边长

    不过这一题的限制条件确实给我带来了不小的麻烦……毕竟运用还不熟练,而且自己采用的写法是一个比较精简的……导致根据题意修改无从下手,不过坚持自己硬憋……总算是找到了突破口……

    一是对于距离的限制
    这个在进行更新离树最近距离时加入判断
    二是到最后是否成树
    根据上一个<一>中的这种判断
    那么会导致在sum+=时有可能加上inf
    那么也就是说,当有可能加上inf时
    也便是寻找了所有可能边都未成树
    所以可以break 进行输出

    成功AC……
    要猝死的节奏……

    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    struct xy {
        int x,y;
    } a[120];
    int main() {
        double dis[120];
        double e[120][120];
        bool flag[120];
        double inf=999999;
        int T;
        scanf("%d",&T);
        while(T--) {
            int N;
            scanf("%d",&N);
            for(int i=1; i<=N; i++) {
                dis[i]=inf;
                flag[i]=false;
            }
            for(int i=1; i<=N; i++) {
                for(int j=1; j<=N; j++) {
                    e[i][j]=inf;
                }
            }
            for(int i=1; i<=N; i++) {
                scanf("%d %d",&a[i].x,&a[i].y);
                for(int j=1; j<=N; j++) {
                    if(i==j)
                        continue;
                    else {
                        double l=sqrt(pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2));
                        e[i][j]=l;
                        e[j][i]=l;
                    }
                }
            }
            double sum=0;
            dis[1]=0;
            bool x=false;
            while(true) {
                int v=-1;
                for(int u=1; u<=N; u++) {
                    if(!flag[u]&&(v==-1||dis[u]<dis[v]))
                        v=u;
                }
                if(v==-1)
                    break;
                flag[v]=true;
                if(dis[v]==inf) {
                    x=true;
                    break;
                } else
                    sum+=dis[v];
                for(int u=1; u<=N; u++) {
                    if(e[v][u]<10||e[v][u]>1000) {
                        continue;
                    }
                    dis[u]=min(dis[u],e[v][u]);
                }
            }
            if(x)
                printf("oh!
    ");
            else
                printf("%.1lf
    ",sum*100);
        }
        return 0;
    }
    

    题目地址:【杭电】[1875]畅通工程再续

  • 相关阅读:
    shell备份数据库
    inux系统设置只让一个固定的ip通过ssh登录和限制连接数量
    linux服务器配置可以执行java的jar包
    sql 查询多久之前的数据
    shell将sql查询结果存放到excel中
    shell编程从初学到精通
    Redis设置键的过期时间
    Java使用redis存取集合对象
    Jpa 连接数据库自动生成实体类
    Idea 开启Run Dashboard
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569771.html
Copyright © 2011-2022 走看看