洛谷 P1522 牛的旅行 Cow Tours(最短路_Floyd)

本文介绍了一种通过Floyd算法计算牧场直径的方法,并讨论了如何在牧场中任意两个未连接的点间建立连接来优化直径长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门


先用Floyd求一次最短路,然后记录对于每一个点距离最远的点,枚举任意两个不联通的点将它们联通,计算新的牧场直径(两点间的距离加上他们各自的最远距离)。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;

const double INF=1e9*1.0;

int n;
int x[160],y[160];
double a[160][160],d[160],l1,l2=INF,ans;

double dis(int i,int j)
{
    return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d %d",&x[i],&y[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            int t;
            scanf("%1d",&t);
            if(t) a[i][j]=dis(i,j);
            else if(i!=j) a[i][j]=INF;
        }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            if(i!=k) for(int j=1;j<=n;j++)
                if(i!=j && k!=j && a[i][k]+a[k][j]<a[i][j]) a[i][j]=a[i][k]+a[k][j];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            if(a[i][j]!=INF) d[i]=max(d[i],a[i][j]);
        l1=max(l1,d[i]);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i][j]==INF) l2=min(l2,d[i]+d[j]+dis(i,j));
    ans=max(l1,l2);
    printf("%.6f",ans);
}
input_tours_for_drones = 20 len_input_tours_for_drones = 7 aoi = utility.build_random_aoi(width_area, height_area, n_target, n_depots, hovering_time=5, seed=seed) depots = aoi.depots depot_first_drone = depots[0] tours_first_drone=[build_random_tour(aoi,depot_first_drone,np.random.randint(len_input_tours_for_drones - 5,len_input_tours_for_drones + 5)) for i in range(input_tours_for_drones)] depot_second_drone = depots[1] tours_second_drone=[build_random_tour(aoi,depot_second_drone,np.random.randint(len_input_tours_for_drones-5, len_input_tours_for_drones + 5)) for i in range(input_tours_for_drones)] uavs_to_tours = {drones[0]: tours_first_drone, drones[1]: tours_second_drone model = TotalCoverageModel(aoi, uavs_to_tours, max_rounds, debug=False) model.build() model.optimize() mrs = model.solution assert mrs is not None, "optimal solution not found" print("TC-OPT covers", mrs.coverage_score(), "targets using", mrs.max_rounds, "rounds") mrs.plot("TC-OPT") # for big istances (over 200/300 points) remove this plot mrs.plot_cumulative_coverage_for_round("TC-OPT") 以上为用Gurobi求解优解问题,请解释以上程序: depot_first_drone = depots[0] tours_first_drone=[build_random_tour(aoi,depot_first_drone,np.random.randint(len_input_tours_for_drones - 5,len_input_tours_for_drones + 5)) for i in range(input_tours_for_drones)] depot_second_drone = depots[1] tours_second_drone=[build_random_tour(aoi,depot_second_drone,np.random.randint(len_input_tours_for_drones-5, len_input_tours_for_drones + 5)) for i in range(input_tours_for_drones)] uavs_to_tours = {drones[0]: tours_first_drone, drones[1]: tours_second_drone是什么意思
06-08
以上程序是一个用 Gurobi 求解优解的问题,主要包括以下步骤: 1. 定义了一个输入参数 input_tours_for_drones,表示每架无人机需要执行的巡航任务数;定义了一个变量 len_input_tours_for_drones,表示巡航任务的长度。 2. 通过调用 build_random_aoi 函数生成一个随机的区域,包括了 n_target 个目标点和 n_depots 个起飞点,并指定了每个起飞点的停留时间为 5 秒。 3. 从生成的起飞点中选择了第一个起飞点为无人机的起飞点,并通过调用 build_random_tour 函数生成了 tours_first_drone 列表,其中包含了 input_tours_for_drones 个随机生成的巡航任务序列。 4. 同理,选择第二个起飞点为第二架无人机的起飞点,并生成了 tours_second_drone 列表,其中也包含了 input_tours_for_drones 个随机生成的巡航任务序列。 5. 将两架无人机的巡航任务分别保存在字典 uavs_to_tours 中,其中 drones[0] 表示第一架无人机,drones[1] 表示第二架无人机。 6. 定义了一个 TotalCoverageModel 模型,将区域信息和无人机的巡航任务传入模型中,并设置了大回合数为 max_rounds。 7. 调用 model.build() 方法生成模型。 8. 调用 model.optimize() 方法求解模型的优解。 9. 将优解保存在变量 mrs 中,并打印出覆盖目标点的数量和使用的大回合数。 10. 后通过调用 mrs.plot() 方法和 mrs.plot_cumulative_coverage_for_round() 方法绘制覆盖率和覆盖率随回合数变化的图表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值