poj1639 Picnic Planning 限制顶点度数的MST

本文介绍了如何解决一个与图论相关的野餐计划问题,该问题要求在不超过k个停车位的情况下找到所有人的最短路程。通过转换为最小生成树问题并采用特定的构建策略,包括kruskal算法和动态规划处理度数限制,逐步构建度数不超过k的生成树。文章详细阐述了每一步骤,并提供了算法实现的运行时间和空间复杂度。
摘要由CSDN通过智能技术生成

题意:

有n个兄弟去野餐,目的地为Park。每个人可以选择直接去Park,也可以选择去其他人家,和他一起坐车去Park。

每个人家的停车位没有限制,但是Park的停车数不能超过k。问所有人的最短路程。


思路:

假设Park的停车数没有限制,那么这题就是一道最小生成树了。

但是本题限制Park的停车数不能超过k,把Park看做根节点记为V0,那么就是说它的度数不能超过k。

得到一棵k度限制生成树的步骤:

1. 忽略根节点做一次kruskal,此时得到的是一个森林,包含了m个最小生成树。

2. 对于每一颗最小生成树树,选择其中离根节点最近的点,向根节点连一条边,此时得到了一棵m度的最小生成树。

3. 由m度生成树得到m+1度生成树:

    (1). 用dp预处理出当前生成树中从V0到点i的路径上与V0无关联的权值最大的边,记为dp[i].d,该边的两端点记为dp[i].u和dp[i].v。

    (2). 对于一个不在生成树中的边<V0, v>, 如果将该边加入生成树中,则一定会得到一个环。

           此时我们删掉环中权值最大的边,即(1)中预处理得到的dp[v],得到一棵m+1度的生成树。

    (3). 对于(2)枚举每一个v,记minnum=min{(V0, v) - dist[v].d },使minnum得到最小值的点v就是这次选择的点。连接V0, v,删去dp[v]。

4. 重复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值