ABC319 G - Counting Shortest Paths

本文介绍了一种使用深度优先搜索和容斥原理解决图中节点分层问题的方法,计算从给定点到其他点的最优距离并统计不同距离的方案数,避免了重复计数。

解题思路

  • 按照到1的距离远近,进行分层
  • 1为第一层
  • 分层步骤:用一个集合记录还未定层的点,用bfs逐层确定
  • 对于当前点x
  • 与其有连边的(不是删边)且还未确定的点,确定为x的下一层,入队列
  • 没连边且还未确定的点,入集合(每次决策建立新集合,用浅拷贝)
  • 直到集合为空
  • 此时,到n的最优距离确定
  • 长度为dis[n]的方案数即为答案
  • 统计方案数,考虑容斥
  • 逐层统计
  • 对于当前层,不考虑删边,到该层每一个点的最优距离的方案数(dis+1)为上一层的方案数
  • 考虑删边,若u\rightarrow v删去,则u的方案不会被统计到v中(不是最优,+1),f[v]=(f[v]-f[x]+md)
  • 注意无法到达的点距离为0,需处理
  • 最终答案为f[n]
  • 对于每层的点不会有重复,使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值