相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组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!
题意是说给你n个点的坐标,要求你将这些点连接起来,而且它们之间的距离不能小于10或者大于1000,每米需要的费用为100元,让你求最少费用,如果不能连接,则输出oh!。

例如:岛屿    1,2,3

             1 和 2 相距 5

             1 和 3 相距 20

             2 和 3 相距 30

      这个是满足题意的;       1 和  2 ,  2  和  3

      如果先判断:1 和 2 相距 5    直接输出oh!,结果 WA;

方法1:kruskal算法


#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define N 100+20
#define M 10000+20
#define inf 0x3f3f3f3f
using namespace std;
int n,len;
int pre[N],x[N],y[N];
struct node
{
int u,v;
double w;
}map[M];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int find(int x)
{
return x==pre[x]?x:find(pre[x]);
}
int mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
return 1;
}
return 0;
}
void Kruskal()
{
sort(map,map+len,cmp);
int cnt=0;
double sum=0;
for(int i=1; i<=len; i++)
{
if(map[i].w<10||map[i].w>1000)
continue;
if(mix(map[i].u,map[i].v))//判断是否已经连接
{
cnt++;
sum+=map[i].w*100;
}
if(cnt==n-1)
break;
}
if(cnt<n-1)
printf("oh!\n");
else
printf("%.1lf\n",sum);
}
int main()
{
int t;
double w;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)//初始化
pre[i]=i;
len=1;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&x[i],&y[i]);
for(int j=1; j<i; j++)//枚举所有的岛
{
w=sqrt((double)(x[i]-x[j])*(double)(x[i]-x[j])+(double)(y[i]-y[j])*(double)(y[i]-y[j]));
map[len].u=i;//起始点
map[len].v=j;//终止点
map[len].w=w;
len++;//个数
}
}
Kruskal();
}
return 0;
}

 

方法二:prime算法

#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 0xfffffff
double map[125][125],low[125],sum;
int x[125],y[125]; //map二维数组存图,low记录每2个点间最小权值,vis标记某点是否已访问
int vis[125];
int n;
double dlen(int i,int j)
{
return sqrt( 1.0*((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])) );
}
void prim()
{
double min,sum=0;
int i,j,pos;
memset(vis,0,sizeof(vis));
vis[1]=1; pos=1; //从某点开始,分别标记vis和记录该点pos
for(i=1;i<=n;++i) //第一次给low数组赋值 map的第一行
low[i]=map[pos][i]; for(i=1;i<n;++i) //再运行n-1次,一次找一个最小
{
min=INF;
for(j=1;j<=n;++j)
{
if(vis[j]==0&&low[j]<min)
{
min=low[j];
pos=j;
}
} if(min==INF) //不能连通 找不到符合条件的
{
printf("oh!\n");
return ;
} vis[pos]=1; //标记该点已访问
sum+=min; //最小权值累加
for(j=1;j<=n;++j) //更新权值low 把 map的 pos 行中比对应的 low 小的赋给low
if(vis[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
} printf("%.1lf\n",sum*100);
return ;
} int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d%d",&x[i],&y[i]);
memset(map,0,sizeof(map));
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
map[i][j]=map[j][i]=dlen(i,j);
if(map[i][j]<10||map[i][j]>1000) //不符合条件 将权值设为无穷大,不会用再到
map[i][j]=map[j][i]=INF;
}
} prim();
}
return 0;
}

D - D (畅通工程再续)的更多相关文章

  1. hdu1875 畅通工程再续 最小生成树并查集解决---kruskal

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  2. 畅通工程再续(MST)

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

  3. HDU 1875 畅通工程再续 (prim最小生成树)

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

  4. HDU 1875 畅通工程再续 (最小生成树)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. HDU 1875 畅通工程再续 (最小生成树)

    畅通工程再续 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/M Description 相信大家都听说一个"百岛湖&q ...

  6. HDU1875——畅通工程再续(最小生成树:Kruskal算法)

    畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...

  7. 畅通工程再续--hdu1875

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  8. HDU1875 畅通工程再续 (并查集)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. HDU 1875:畅通工程再续(最小生成树)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  10. 畅通工程再续(hdu1875) 并查集

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. Oracle控制文件多路复用以及Oracle备份重建控制文件

    控制文件中记录了oracle数据库的物理结构,也就是记录了数据库数据文件和日志文件的位置,控制文件中还记录了多种SCN,用这些SCN来确定数据文件和日志文件是否是正确的.如果不正确那么数据库就需要恢复 ...

  2. Go GRPC 入门(二)

    前言 最近较忙,其实准备一篇搞定的 中途有事,只能隔了一天再写 正文 pb.go 需要注意的是,在本个 demo 中,客户端与服务端都是 Golang,所以在客户端与服务端都公用一个 pb.go 模板 ...

  3. 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization

    Azure Active Directory (Azure AD) is Microsoft's cloud-based identity and access management service, ...

  4. 【Redis3.0.x】持久化

    Redis3.0.x 持久化 概述 Redis 提供了两种不同的持久化方式: RDB(Redis DataBase)持久化,可以在指定的时间间隔内生成数据集的时间点快照. AOF(Append Onl ...

  5. docker 数据卷的挂载和使用

    容器之间的数据共享技术, Docker容器产生的数据同步到本地 卷技术 --> 目录挂载, 将容器内的目录挂载到服务器上 使用命令来挂载 -v # 可以挂载多个目录 docker run -it ...

  6. kubernets之控制器之间的协作以及网络

    一  创建一个deployment的时候整个kubernets集群的资源和事件的调用链 1.1  创建一个deployment的资源,在提交的时候,集群中的调度器,控制器以及node节点上kubele ...

  7. LeetCode897. 递增顺序查找树

    题目 法一.自己 1 class Solution { 2 public: 3 vector<int>res; 4 TreeNode* increasingBST(TreeNode* ro ...

  8. buuctf刷题之旅—web—WarmUp

    启动靶机 查看源码发现source.php 代码审计,发现hint.php文件 查看hint.php文件(http://7ab330c8-616e-4fc3-9caa-99d9dd66e191.nod ...

  9. [GKCTF2020]老八小超市儿

    题目来自buu 一.题目初探 首先是一个shopxo搭建的演示站,通过扫描后台得到如下的网页 二.题目解答 首先是找到后台登陆的admin.php,然后通过百度找到shopxo的默认管理员登陆账号和密 ...

  10. kubectl命令管理

    kubectl命令管理 查看更多帮助命令 [root@k8s-master ~]# kubectl --help 创建一个命名空间 [root@k8s-master ~]# kubectl creat ...