POJ2349(kruskal算法建立最小生成树)

题意:在要求将所有无线网站点都连接起来的基础上输出D的最小值。D是任意无线网站点使用无线收发电机直接对外联系距离的最大值。无线网站点连接有两种方式:使用无线收发电机和卫星信道连接。给定数据是哨站的数量 ,卫星信道的数量,哨站的坐标。求解D的最小值。

思路:

(1)首先考虑没有卫星信道时我们如何求解D的最小值。

回顾kruskal算法的求解过程发现,这道题用kruskal算法解决再好不过了。因为kruskal就是将结点之间边的权值按照从小到大排序后再进行非连通图合并成连通图这个操作的。

所以:题目的解决就显而易见:用kruskal求最小生成树,将合并过的边标记,标记表示这条边在最小生成树中。然后遍历标记过的边求出权值最大的那条边即可。

此时,D的最小值就是最小生成树上的最大边权

(2)现在有了卫星信道,我们再考虑D的最小值。

这时我们的思路就可以转移到减小最小生成树的最大边权了。

首先联系卫星信道的作用:在不考虑两个站点坐标的情况下将它们连接,这就是卫星信道的作用。但是前提条件是连接的两个站点必须都要安装卫星信道(这个隐含条件必须看出来)。那么我们就考虑“减边”操作。

那么我们为了使信道利用最大化,将一个卫星信道放到最后去掉的边的端点上。然后从大到小的减少最小生成树上的最大边权。

减边操作的截止条件是信道使用完成。

然后遍历最小生成树,此时求出的“减去边后”的最大边权就是D的最小值。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=505;
int n,s,qq;//s是卫星基站的数量
double ans;
int pre[maxn];
struct post
{
    int from;
    int 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值