zoukankan      html  css  js  c++  java
  • 网络流

    $学了一些技巧$

    1.二元组

    $例题:bzoj2127 bzoj2132 bzoj3438 bzoj1976$

    $对于这样一种题型:$

    $i,j如果同属于/不同属于S或T获得收益w(i,j)$

    $i属于S获得a[i],属于T获得b[i]$

    $bzoj2132是这种问题的裸题$

    $有一种独特的建图方法$

    $insert(s, i, a[i])$

    $insert(i, t, b[i])$

    $insert(s, j, a[j])$

    $insert(j, t, b[j])$

    $insert(i, j, w(i, j))$

    $insert(j, i, w(i, j))$

    $然后跑最小割就行了,注意如果是属于不同集合那么把a[i],b[i]位置适当调换一下就行了,bzoj1976也可以这样解决$

    $这种问题只适用于二元组,bzoj3438不能这样解决,只能用最大权闭合子图解$

    $但是最大权闭合子图只能解决属于同一集合的问题,如bzoj2127;bzoj2132就无法$

    $解决。$

    $所以碰见同属一集合就用最大权闭合子图,否则就用二元组就行了。$

    $2.最大权闭合子图$

    $对于一些点之间的依赖关系,如果i依赖j,也就是选了j必须选i,那么insert(i, j, inf),$

    $如果w[i] < 0 insert(i, sink, -w[i]), 否则 insert(source, i, w[i])$

    $然后答案是sum_{w[i]>=0 } {w[i]} - dinic()$

    $例题:bzoj3996$

    $化简完变成sum_{i=1}^{n}sum_{j=1}^{n}{a_i*a_j*b_{ij}}-sum_{i=1}^{n}{b_i}$

    $根据最大权闭合子图的定义,我们可以看出如果选择了某个c_i,那么对应的a_{i}=1。$

    $所以如果某个b_{ij}选了,那么对应的c_i,c_j也得选$

    $得出建图:insert(source, b -> ij, b_ij) insert(c -> i, sink, -c_i) 对于某个b_{ij},insert(b -> ij, c -> i, inf) insert(b -> ij, c -> j, inf)$

    $最大权闭合子图解决$

    $3.拆点$

    $例题 bzoj1163 bzoj1570 bzoj1280 bzoj3144$

    $限制点权:bzoj1163 比较明显的拆点$

    $天数:bzoj1570 bzoj1280:把物品拆成每天,考虑连边$

    $bzoj3144:限制相邻<=D,不算拆点吧,通过向相邻x-D的点连inf保证$

    $4.线性规划$

    $列出一些式子,把不等式通过加辅助变量变成等式,再添加两个0=0,差分,常数项>0从source连入,否则连向sink。变量>0连向<0$

  • 相关阅读:
    nginx详解
    keeplived高可用集群
    mysql主从同步
    elasticsearch基础
    redis集群管理--sentinel
    socket阻塞与非阻塞,同步与异步,select,pool,epool
    django+channels+dephne实现websockrt部署
    Django+Nginx+uWSGI生产环境部署
    进制转换
    对golang指针的理解
  • 原文地址:https://www.cnblogs.com/19992147orz/p/8451240.html
Copyright © 2011-2022 走看看