作者:钢铁猪991884679 | 来源:互联网 | 2023-05-17 19:49
暴风式哭泣;
存板子存板子;
终于搞懂了。mmpiu
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define INF 0x3fffffff
const int maxn = 100 + 5;
struct edge
{
int to, cap, rev;
edge(int a,int b,int c):to(a),cap(b),rev(c){}
};
vector g[maxn*4];
int level[maxn*4];
int iter[maxn*4];
void add_edge(int from, int to, int cap) {
g[from].push_back(edge(to, cap, g[to].size()));
g[to].push_back(edge(from, 0, g[from].size()-1));
}
void bfs(int s) {
memset(level, -1, sizeof(level));
queue q;
level[s] = 0;
q.push(s);
while (!q.empty()) {
int v = q.front();
q.pop();
for (int i = 0; i 0 && level[e.to] <0) {
level[e.to] = level[v] + 1;
q.push(e.to);
}
}
}
}
int dfs(int v, int t, int f) {
if (v == t)return f;
for (int &i = iter[v]; i 0&&level[v] 0) {
e.cap -= d;
g[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
int max_flow(int s, int t) {
int flow = 0;
for (;;) {
bfs(s);
if (level[t] <0)return flow;
memset(iter, 0, sizeof(iter));
int f;
while ((f = dfs(s, t, INF)) > 0) {
flow += f;
}
}
}
int N, F, D;
bool likef[maxn][maxn];
bool liked[maxn][maxn];
void solve() {
int s =0;
int t = N * 2 + F + D + 1;
for (int i = 1; i <=F; i++) {
add_edge(s, N * 2 + i,1);
}
for (int i = 1; i <=D; i++) {
add_edge(N * 2 + F + i, t, 1);
}
for (int i = 1; i <=N; i++) {
add_edge(i, N + i, 1);
for (int j = 1; j <= F; j++) {
if (likef[i][j])add_edge(N * 2 + j, i, 1);
}
for (int j = 1; j <= D; j++) {
if (liked[i][j])add_edge(N+i,N * 2+F + j, 1);
}
}
printf("%d\n", max_flow(s, t));
}
int main() {
while (cin >> N >> F >> D) {
memset(liked, 0, sizeof(liked));
memset(likef, 0, sizeof(likef));
int a, b, x;
for (int i = 1; i <= N; i++) {
cin >> a >> b;
for (int j = 0; j > x;
likef[i][x] = 1;
}
for (int j = 0; j > x;
liked[i][x] = 1;
}
}
solve();
}
}