[BZOJ3415][POI2013]Price List(图论删边)

一道图论题目,原以为简单却隐藏复杂性。从一个点出发有三种走法:一步步走a,合并b边为a,或特殊情况的走法。暴力解法无法通过,需要优化。优化方法包括确保每个点只被更新一次,避免形成更新环,并在更新后删除无用边以减少枚举。提供了问题的代码实现。
摘要由CSDN通过智能技术生成

题目:

我是超链接

题解:

本来以为是一道sb题然后WA过了才知道是大神题。。。

到达一个点有三种走法(窝一开始以为是两种)
1、一步步走a到达
2、当b < 2a,可以把两条a缩成一条b,如果是奇数就先走a
3、当b < a,这是一种很奇怪的走法,可以通过走更多的边数来换取较少的距离
这里写图片描述
比如这个图,到达A可以走a+b,也可以走2b

我们首先考虑暴力,就是当枚举到一个点,首先一边遍历与他相邻的点,对于这些点再二次遍历相邻的点,这次相邻的点可以用这个枚举点+b的长度更新

当然这样是过不去的,我们还需要优化。
首先每个点只会被更新一次,只有被更新点才有机会继续更新别的点。被更新一次是必然的,不然形成一个更新环就GG了

然后对于一组点A-x-y,可能会经历这样的过程,更新了y之后y入队,y反向边找到x,x又找到y,诚然这不会让答案错误,但是速度会慢,M^2的效率,我们可以考虑在更新的y之后把x-y这条边删掉,这样就不会进一步无用枚举了

代码:

#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
using 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值