互补松弛定理
xi,yi分别为原问题和对偶问题的最优解,当且仅当
sigma(aij*yi | i=1~m)==cj or xi=0 j=1,2...,n
sigma(aij*xj | j=1~n)==bi or yi=0 i=1,2...m
题意:给一个n*n的矩阵,每次可以攻击一列或者一行,攻击一行的代价为Ai,攻击一列的代价为Bi,要求每个格子i,j至少被攻击F[i][j]次,要使得总代价最小,同时输出方案
第一次接触对偶定理就是这道题,那时候把对偶弄清楚了,但是互补松弛定理一直无法理解,不会输出方案就不了了之了...就对偶之后的建图来说,其实比日本那道题要简单一些
首先先把第一步的对偶定理做好,建立n+n个变量,lx1...lxn,ly1...lyn分别表示每行每列攻击了几次
则我们的目标是
min{(A1...An,B1....Bn)*(lx1...lyn)'}
约束条件
lxi+lyj>=F[i][j]
系数矩阵不好画就自己yy吧...
对偶之后化为
max{(y11...ynn)*(F[1][1]..F[n][n])'}
约束条件提取
sigma(yi | i=(k-1)*n+1~k*n)<=Ak
sigma(yi*n+k | i=1~n)<=Bk
然后根据这个建图
源点连出n个点,每条边容量为Ai,费用为0
n个点连向汇点,每条边容量为Bi,费用为0
中间连n*n条边,<i,j>,容量为oo,费用为