zoukankan      html  css  js  c++  java
  • bzoj2324后续思考

    昨天写bzoj2324的解题报告的时候突然隐隐约约发现了我程序的一点问题

    睡了一觉之后找到了反例

    如下:

    4 4 2

    0 1 2

    1 2 1

    2 3 2

    2 4 2

    对于这个测试数据,显然最短路径和为

    1个人呆在0点,1个人从走0—1—2—3—2—4

    最短路径和为0+9=9

    但实际我跑出的结果为10

    为什么呢?因为最小费用最大流是在最大流的前提下求最小费用

    对于这个图,最大流为2,那么跑完第一个流1之后,下一个流还要再流

    也就是说,对于多余人,会影响最后的结果。

    怎么处理呢?朴素的方法是,穷举人数,然后找出最小的路径和

    考虑到k<=10,应该是不会TLE的

    但有没有跟简单的方法呢?

    我曾经考虑了两种方法

    1. 当每个点都被访问之后就直接退,但事实上(也许是水平不够实现的问题),这个连样例都过不了

    打印一下过程

    运行了两次5   -2  

    这突然让我想到了背模板时一直不理解的问题:费用流的反向弧负费用是干什么的?

    2. 正确的方法应该是不断费用流,直到产生了正权费用,这时候说明所有极小边都走过了,于是就可以直接退出增广了

  • 相关阅读:
    try catch 和\或 finally 的用法
    postgresql与oracle对比
    今天遇到个let: not found
    NTLM相关
    【搜藏】net use命令拓展
    【shell进阶】字符串操作
    【网摘】网上邻居用户密码
    测试导航
    关系代数合并数据 left join
    真正的程序员
  • 原文地址:https://www.cnblogs.com/phile/p/4473251.html
Copyright © 2011-2022 走看看