• HDU_1875_畅通工程再续


    畅通工程再续

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 17056    Accepted Submission(s): 5313


    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!
     
     
     
    题解:最小生成树
     
    代码:

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;

    struct island
    {
      int x;
      int y;
    };

    struct path
    {
      int a;
      int b;
      double dis;
    };


    struct island num1[110];
    struct path num2[10000];
    int father[110];
    double sum;

    bool cmp(path a,path b)
    {
      if(a.dis<b.dis)
        return 1;
      return 0;
    }

    int find(int x)
    {
      if(father[x]!=x)
        father[x]=find(father[x]);
      return father[x];
    }

    void merge(struct path xx)
    {
      int x,y;
      x=find(xx.a);
      y=find(xx.b);
      if(x!=y)
      {
        father[x]=y;
        sum+=xx.dis;
      }
    }
    int main()
    {
      int t,c,i,j,cnt,cnt1;
      double dist;
      scanf("%d",&t); 
      while(t--)
      {
        scanf("%d",&c);
        for(i=0; i<c; i++)
          father[i]=i;
        for(i=0; i<c; i++)
          scanf("%d%d",&num1[i].x,&num1[i].y);
        for(i=0,cnt=0; i<c; i++)
          for(j=i+1; j<c; j++)
          {
            dist=sqrt((double)(num1[j].x-num1[i].x)*(num1[j].x-num1[i].x)+(num1[j].y-num1[i].y)*(num1[j].y-num1[i].y));
            if(dist>=10&&dist<=1000)
            {
              num2[cnt].dis=dist;
              num2[cnt].a=i;
              num2[cnt].b=j;
              cnt++;
            }
          }
        if(cnt>=2)
          sort(num2,num2+cnt,cmp);  //排序注意时间复杂度,用自己写的排序(选择排序)可能会超时
        sum=0;
        for(i=0; i<cnt; i++)
          merge(num2[i]);
        for(i=0,cnt1=0; i<c; i++)
          if(father[i]==i)
            cnt1++;
        if(cnt1==1)
          printf("%.1lf ",sum*100);
        else
          printf("oh! ");
      }
      return 0;
    }

  • 相关阅读:
    html5实现全屏的api方法
    用html5(requestFullscreen) js实现点击一个按钮使浏览器全屏效果
    HTML5 中fullscreen 中的几个API和fullscreen欺骗
    杭州收集
    JS DOM -- 关于回车键盘事件执行事件
    AngularCSS 的引入: CSS On-Demand for AngularJS
    用Javascript获取页面元素的位置
    angularjs 可以加入html标签方法------ng-bind-html的用法总结(2)
    angularjs 可以加入html标签方法------ng-bind-html的用法总结(1)
    onkeypress、onkeydown、onkeyup
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/4391728.html
Copyright © 2020-2023  润新知