60pts
#include <bits/stdc++.h>
using namespace std;
#define inf 1000000000000000
#define V 50010
#define E 1000010
typedef long long int ll;
struct edge {
public:
int to, next;
ll capa;
};
int cnt = 0, head[V]; int n, m; vector<edge>node(E);
inline void add(int fir, int nxt, ll w) {
node[cnt].to = nxt;
node[cnt].capa = w;
node[cnt].next = head[fir];
head[fir] = cnt; ++cnt;
}
int s, t, deep[V], gap[V], cur[V]; queue<int>que; ll sum = 0;
inline void initing() {
memset(deep, -1, V * sizeof(int));
memcpy(cur, head, V * sizeof(int));
}
inline void bfs() {
int fro, ito;
que.push(t); deep[t] = 0; ++gap[deep[t]];
while (!que.empty()) {
fro = que.front(); que.pop();
for (register int i = head[fro]; i != -1; i = node[i].next) {
ito = node[i].to;
if (deep[ito] == -1) {
deep[ito] = deep[fro] + 1;
que.push(ito);
++gap[deep[ito]];
}
}
}
}
ll dfs(int u, ll flow) {
if (u == t || flow == 0)return flow; ll used = 0, wei = 0;
for (int i = cur[u]; i != -1; i = node[i].next) {
cur[u] = i;
if (deep[u] == deep[node[i].to] + 1 && node[i].capa > 0) {
wei = dfs(node[i].to, min(flow - used, node[i].capa));
if (wei) {
node[i].capa -= wei;
node[i ^ 1].capa += wei;
used += wei;
}
}
if (used == flow)return used;
}
if (used < flow) {
--gap[deep[u]];
if (!gap[deep[u]])deep[s] = t + 1;
++gap[++deep[u]];
}
return used;
}
ll ISAP() {
initing(); bfs();
while (deep[s] < t) {
sum += dfs(s, inf);
memcpy(cur, head, V * sizeof(int));
}
return sum;
}
int main() {
ios::sync_with_stdio(0);
memset(head, -1, V * sizeof(int));
int p, q; cin >> n >> p >> q; bool ls;
s = 1; t = n * 2 + p + q + 2;
int llen = p + 1, kr = n + llen, kr2 = kr+n, cai = kr2 + q;
for (int i = 2; i <= llen; i++) {
add(s, i, 1);
add(i, s, 0);
}
for (int i = 2; i <= llen; i++) {
for (int j = llen + 1; j <= kr; j++) {
cin >> ls;
if (ls == true) {
add(i, j, 1);
add(j, i, 0);
}
}
}
for (int i = llen+1; i <= kr; i++) {
add(i, i + n, 1);
add(i + n, i, 0);
}
for (int i = kr + 1; i <= kr2; i++) {
for (int j = kr2 + 1; j <= cai; j++) {
cin >> ls;
if (ls == true) {
add(i, j, 1);
add(j, i, 0);
}
}
}
for (int i = kr2 + 1; i <= cai; i++) {
add(i, t, 1);
add(t, i, 0);
}
ISAP();
cout << sum;
return 0;
}
目前已知是ISAP的祸,拆点是对的。
Hack数据:
3 2 2
1 0
1 0
0 1
1 0
0 1
1 0
Hack数据图:
画红边的增广路没被增广到
救救孩子吧,实在调不出来了Orz。