bzoj4514 数字配对

时间:2023-03-09 04:34:48
bzoj4514 数字配对

# 思路
首先想到费用流。
对于每个点拆点。然后考虑我们怎样才能保证每个点只被用一次。
如果$i$与$j$满足条件。那么就从$i$向$j$连一条边并且从$j$向$i$连一条边。这样每次增广的时候我们都可以看作某一条边被增广了两次。显然从$i$到$j$和从$j$到$i$的边是等价的。也就是说,如果当前增广这两个点之间的边更优秀,那么在增广完成从$i$到$j$和从$j$到$i$这两条边流量变为$0$之前不回去增广其他的边。
比较难解释,仔细想一下可以发现是对的。这样最后我们找出的流量实际上是答案的两倍。除二即可。
然后还要考虑题目中对于价值的限制。我们把价值当作费用,每次增广费用最大的路径。直到如果再增广费用变为负数为止。
# 代码
```cpp=
/*
* @Author: wxyww
* @Date: 2019-02-17 14:52:25
* @Last Modified time: 2019-02-17 19:36:45
*/
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 410,M = 1000000 + 100,INF = 1e9;
ll read() {
ll x=0,f=1;char c=getchar();
while(c'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&cq;
int S,T;
bool pd(int x,int y) {
if(x > 1);
return 0;
}
```