zoukankan      html  css  js  c++  java
  • HDU 1875 畅通工程再续 prim模板题

    B - 畅通工程再续
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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!
     
    注意while(t--)时,最后会是-1,傻逼的突然被这卡住了,硬是纠结了1小时。
    主要是理解如何对这些点求距离,条件10《=l<=1000。当不再此条件时,便不可以建树。
     1 #include<cstdio>
     2 #include<cmath>
     3 #include<iostream>
     4 using namespace std;
     5 #define INF 999999999
     6 int n;
     7 int x[110],y[110],visit[110];
     8 double map[110][110],dis[110];
     9 double w(int i,int j)
    10 {
    11     return sqrt(1.0*((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
    12 }
    13 void input()
    14 {
    15     int i,j;
    16     double l;
    17     scanf("%d",&n);
    18     for(i=1;i<=n;i++)
    19     scanf("%d%d",&x[i],&y[i]);
    20     for(i=1;i<=n;i++)
    21     for(j=1;j<=n;j++)
    22     {
    23         l=w(i,j);
    24         if(l>=10&&l<=1000)
    25     map[i][j]=map[j][i]=l;
    26     else
    27     map[i][j]=map[j][i]=INF;
    28 }
    29     return;
    30 }
    31 void prim()
    32 {
    33     int t=n,i,j,pos;
    34         for(int i=2;i<=n;i++)
    35     {
    36         visit[i]=0;
    37         dis[i]=map[i][1];
    38     }
    39     visit[1] = 1;
    40     double sum=0,temp;
    41     while(t--)
    42     {
    43          temp=INF;
    44         for(int j=1;j<=n;j++)
    45         {
    46             if(!visit[j]&&dis[j]<temp)
    47             {
    48                 temp=dis[j];
    49                 pos=j;
    50             }
    51         }
    52         if(temp==INF)break;
    53         visit[pos]=1;
    54         sum+=dis[pos];
    55         for(int j=1;j<=n;j++)
    56         {
    57             if(!visit[j]&&dis[j]>map[pos][j])
    58                 dis[j]=map[pos][j];
    59         }
    60     }
    61        if(t==0)
    62     {
    63         printf("%.1f
    ",sum*100);
    64     }
    65     else printf("oh!
    ");
    66 }
    67 main()
    68 {
    69     int T;
    70     scanf("%d",&T);
    71     while(T--)
    72     {
    73         input();
    74         prim();
    75     }
    76 }
    View Code
  • 相关阅读:
    微信小程序--form表单消息推送
    微信小程序学习笔记五(持续更新)---小程序上传文件
    微信小程序学习笔记四(持续更新)---征服scroll-view下拉刷新
    微信小程序学习笔记三(持续更新)---小程序组件通信
    微信小程序学习笔记二(持续更新)---小程序网络请求封装
    linux下安装微信开发者工具(fedora27)
    初学小程序学习笔记(持续更新)
    bootstrap使用popover插件实现点击按钮显示二维码图片
    gulp-jshint 编译出错Error:Cannot find modul 'jshint/src/cli' 解决办法
    vscode 下的 typescript 自动编译方法
  • 原文地址:https://www.cnblogs.com/CrazyBaby/p/5440445.html
Copyright © 2011-2022 走看看