HDU----1875
2016-07-24 16:40
330 查看
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<stdio.h>
#include<stdlib.h>
#include<math.h>
struct road{
int x,y;
double v;
}r[5002];
struct point{
int a,b;
}p[102];
int cmp(const void *a,const void *b)
{
struct road *aa=(struct road *)a;
struct road *bb=(struct road *)b;
return aa->v > bb->v ? 1:-1;
}
int bin[102];
int find(int x)
{
int r=x;
while(bin[r]!=r)
r=bin[r];
int y=x;
while(bin[y]!=y)
{
y=bin[y];
bin[y]=r;
}
return r;
}
int main()
{
int t,n,i,j,num,cnt;
double ans;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&p[i].a,&p[i].b);
num=0;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
r[num].x=i, r[num].y=j;
r[num].v=sqrt(1.0*(p[i].a-p[j].a)*(p[i].a-p[j].a)+(p[i].b-p[j].b)*(p[i].b-p[j].b));
num++;
}
for(i=0;i<n;i++)
bin[i]=i;
qsort(r,num,sizeof(r[0]),cmp);
i=0; ans=0; cnt=0;
while(r[i].v<10)
i++;
for(;i<num && cnt<n-1;i++)
{
if(r[i].v>1000) break;
int fx=find(r[i].x), fy=find(r[i].y);
if(fx!=fy)
{
bin[fx]=fy;
cnt++;
ans+=r[i].v;
}
}
if(cnt==n-1)
printf("%.1lf\n",ans*100);
else
printf("oh!\n");
}
return 0;}
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组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<stdio.h>
#include<stdlib.h>
#include<math.h>
struct road{
int x,y;
double v;
}r[5002];
struct point{
int a,b;
}p[102];
int cmp(const void *a,const void *b)
{
struct road *aa=(struct road *)a;
struct road *bb=(struct road *)b;
return aa->v > bb->v ? 1:-1;
}
int bin[102];
int find(int x)
{
int r=x;
while(bin[r]!=r)
r=bin[r];
int y=x;
while(bin[y]!=y)
{
y=bin[y];
bin[y]=r;
}
return r;
}
int main()
{
int t,n,i,j,num,cnt;
double ans;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&p[i].a,&p[i].b);
num=0;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
r[num].x=i, r[num].y=j;
r[num].v=sqrt(1.0*(p[i].a-p[j].a)*(p[i].a-p[j].a)+(p[i].b-p[j].b)*(p[i].b-p[j].b));
num++;
}
for(i=0;i<n;i++)
bin[i]=i;
qsort(r,num,sizeof(r[0]),cmp);
i=0; ans=0; cnt=0;
while(r[i].v<10)
i++;
for(;i<num && cnt<n-1;i++)
{
if(r[i].v>1000) break;
int fx=find(r[i].x), fy=find(r[i].y);
if(fx!=fy)
{
bin[fx]=fy;
cnt++;
ans+=r[i].v;
}
}
if(cnt==n-1)
printf("%.1lf\n",ans*100);
else
printf("oh!\n");
}
return 0;}
相关文章推荐
- java面向对象
- Java非证书下的加密解密过程小解析
- [HDU 5727] Necklace (暴力 + 二分图匹配)
- ffmpeg开发指南
- javscript对cookie的操作,以及封装
- 对于Android中TextView组件一些理解
- Spring 中bean 的生命周期(转载)
- HDU 5615 Jam's math problem <数学>
- linux中class_create和class_register说明
- Android的IPC机制一
- java内存模型(一)
- com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process
- JAVA学习笔记之IO详解一
- 系统架构设计——设计模式之模板模式
- 简单整理下CSS里的常用各种选择器
- 3.10 把一张一元纸币换成一分、二分和五分的硬币,假如每种至少一枚,问有多少 种换法?编程将各种换法显示出来。
- 图片轮播代码学习(工具的封装)
- Windows Data Types
- MSYS2 + MinGW-w64 + Git + gVim 环境配置
- java 部分隐藏字段