码迷,mamicode.com
首页 > 其他好文 > 详细

畅通工程再续

时间:2015-04-04 11:50:28      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

畅通工程再续

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\n",sum*100);
    else
      printf("oh!\n");
  }
  return 0;
}

畅通工程再续

标签:

原文地址:http://www.cnblogs.com/jasonlixuetao/p/4391728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!