poj2349 Arctic Network - 最小生成树
2017-08-04 16:19:13
writer:pprp
题意如下:
Description
Any two outposts with a satellite channel can communicate via the satellite, regardless of their location. Otherwise, two outposts can communicate by radio only if the distance between them does not exceed D, which depends of the power of the transceivers. Higher power yields higher D but costs more. Due to purchasing and maintenance considerations, the transceivers at the outposts must be identical; that is, the value of D is the same for every pair of outposts.
Your job is to determine the minimum D required for the transceivers. There must be at least one communication path (direct or indirect) between every pair of outposts.
Input
Output
Sample Input
1
2 4
0 100
0 300
0 600
150 750
Sample Output
212.13 题意简化:
个人觉得这道题最难的在于理解,简化以后的题意是:
• n个站点,s个卫星系统,每个卫星系统只能安排在一个站点
• 有卫星系统的站点间通讯不需要代价
• 任意两点(i, j)间皆可通讯,代价为dis[i][j]
• 请用最小的代价使得任意两个站点间均可以通讯
• n, s <= 1000
分析:
n个站点,应该用Kruskal算法进行最小生成树的进行;用ans数组记录下来从小到大的边的边权,
最终结果就应该是ans[num - s] num是最小生成树的边的数目,等于是最后n个比较大的被舍去,需要最大的就是被舍去以后最大的点
代码及分析:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std;
//n个卫星,m个基站
int n, m;
int x, y;
const int maxn = ;
const int INF = 0x3f3f3f3f;
int parent[maxn];
//有多少个边
int num;
//ans数组中存储的是升序排序的入树的边的权值
double ans[maxn]; struct point
{
int x;
int y;
} p[maxn]; struct ds
{
int u;
int v;
double w;
} d[maxn * maxn + maxn]; double dist(const point& a, const point& b)
{
return sqrt(1.0 * (a.x - b.x) * (a.x - b.x) +
1.0 * (a.y - b.y) * (a.y - b.y));
} bool cmp(const ds &a, const ds& b)
{
return a.w < b.w;
} //并查集中找到父节点的操作
int Find(int x)
{
//递归?
//parent[x] = Find(parent[x]);
//return parent[x]; //自己写的迭代
int tmp = x;
while(parent[tmp] != tmp)
{
tmp = parent[tmp];
} return tmp;
} void merge(int x, int y)
{
int fa = Find(x);
int fb = Find(y);
if(fa != fb)
{
parent[fa] = fb;
}
} void init()
{
scanf("%d%d",&n,&m);
num = ;
for(int i = ; i < m ; i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
} for(int i = ; i < m ; i++)
for(int j = i + ; j < m ; j++)
{
d[num].u = i;
d[num].v = j;
d[num++].w = dist(p[i],p[j]);
} for(int i = ; i <= m ; i++)
parent[i] = i; //从小到大进行排序
sort(d,d+num,cmp);
} //最主要的代码:Kruskal
void kruskal()
{
int cnt = ;
for(int i = ; i < num ; i++)
{
int fa = Find(d[i].u);
int fb = Find(d[i].v); if(fa != fb)
{
merge(d[i].u,d[i].v);
ans[cnt++] = d[i].w;
}
}
printf("%.2f\n",ans[cnt - n]);
} int main()
{
int t; scanf("%d",&t); while(t--)
{
init();
kruskal();
}
return ;
}
注意点:在poj提交的时候对double型的应该用%f\n而不要用%lf\n
poj2349 Arctic Network - 最小生成树的更多相关文章
- [poj2349]Arctic Network(最小生成树+贪心)
Arctic Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17758 Accepted: 5646 D ...
- [Poj2349]Arctic Network(二分,最小生成树)
[Poj2349]Arctic Network Description 国防部(DND)要用无线网络连接北部几个哨所.两种不同的通信技术被用于建立网络:每一个哨所有一个无线电收发器,一些哨所将有一个卫 ...
- POJ 2349 Arctic Network (最小生成树)
Arctic Network Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- POJ2349 Arctic Network 2017-04-13 20:44 40人阅读 评论(0) 收藏
Arctic Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19113 Accepted: 6023 D ...
- POJ2349 Arctic Network(Prim)
Arctic Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16968 Accepted: 5412 D ...
- POJ-2349 Arctic Network(最小生成树+减免路径)
http://poj.org/problem?id=2349 Description The Department of National Defence (DND) wishes to connec ...
- TZOJ 2415 Arctic Network(最小生成树第k小边)
描述 The Department of National Defence (DND) wishes to connect several northern outposts by a wireles ...
- POJ2349 Arctic Network
原题链接 先随便找一棵最小生成树,然后贪心的从大到小选择边,使其没有贡献. 显然固定生成树最长边的一个端点安装卫星频道后,从大到小选择边的一个端点作为卫星频道即可将该边的贡献去除. 所以最后的答案就是 ...
- POJ 2349 Arctic Network(最小生成树+求第k大边)
题目链接:http://poj.org/problem?id=2349 题目大意:有n个前哨,和s个卫星通讯装置,任何两个装了卫星通讯装置的前哨都可以通过卫星进行通信,而不管他们的位置. 否则,只有两 ...
随机推荐
- freemarker的${!}
${sss!} <#--没有定义这个变量,默认值是空字符串! --> ...................................... 转自:https://blog.csdn ...
- mysql连接远程数据库的用法
mysql -u root -p 等这些常用的参数外,你知道多少?来测试一下吧 一,mysql命令行参数 Usage: mysql [OPTIONS] [database] //命令方式 -?, ...
- 【微信】QQ邮箱助手不提醒解决
1.问题及原因: 微信上的QQ邮箱提醒功能失效了,收到信后不提醒.忘了是使用了TIM,还是使用了QQ邮箱之后才出现的. 不过原因是:QQ邮箱提醒被设置为仅在QQ邮箱客户端提醒 2.解决: 重新安装QQ ...
- PHP去除所有的空格
1.去除两边的空格 trim($arr) 2.正则匹配去除所有的空格 preg_replace('# #','',$goodid)
- Django - 文件上传、Django组件 - 分页器(paginator)
一.文件上传准备知识 - Content-Type 1.请求头 - Content-Type Content-Type指的是请求体的编码类型,常见的类型共有3种: 1)application/x-ww ...
- Android图片加载框架Picasso最全使用教程4
通过前几篇的学习,我们已经对Picasso的加载图片的用法有了很深的了解,接下来我们开始分析Picasso为我们提供的其他高级功能及内存分析,Let’sGo ! Picasso进行图片的旋转(Rota ...
- Flash本地共享对象 SharedObject
以下内容是对网上一些资料的总结 Flex SharedObject 介绍(转自http://www.eb163.com/club/thread-3235-1-1.html): Flash的本地共享对象 ...
- uiautomator定位元素
- Appium中的logger
原文地址http://blog.csdn.net/itfootball/article/details/45395901 appium中的log输出量很大,我们分析问题的时候会依赖于这些log,但是你 ...
- input和raw_input的区别
input会假设用户输入的是合法的Python表达式raw_input会把所有的输入当作原始数据,然后将其放入字符串中. 在最新的版本之中,input可以直接使用,替代了raw_input. 在2.7 ...