rt,不注释掉的话除了第一个点,其他全t
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vector<ll>> vllvll;
struct zym {
ll from, to, cup, flow;//边的起点,终点,容量,流量
};
int sum[100] = { 0,1 };
void solve() {
ll n, m, e, maxflow = 0, kl, now;
cin >> n >> m >> e;
ll S = 0, T = n + m + 1;
vector<zym>edge;
vllvll g(n + m + 10);
vll f(n + m + 10), per(n + m + 10);
map<pair<ll, ll>, int>op;
for (int i = 1; i <= e; i++) {
ll a, b;
cin >> a >> b;
b += n;
edge.push_back({ a,b,1,0 });
edge.push_back({ b,a,0,0 });
kl = edge.size();
g[a].push_back(kl - 2);
g[b].push_back(kl - 1);
}
for (int i = 1; i <= n; i++) {
edge.push_back({ S,i,1,0 });
edge.push_back({ i,S,0,0 });
kl = edge.size();
g[S].push_back(kl - 2);
g[i].push_back(kl - 1);
}
for (int i = n + 1; i <= n + m; i++) {
edge.push_back({ i,T,1,0 });
edge.push_back({ T,i,0,0 });
kl = edge.size();
g[i].push_back(kl - 2);
g[T].push_back(kl - 1);
}
queue<ll>Q;
while (1) {
for (int i = 0; i <= T; i++)f[i] = 0;
f[0] = INT_MAX;
Q.push(0);
while (!Q.empty()) {
now = Q.front();
Q.pop();
for (auto to : g[now]) {
if (!f[edge[to].to] && edge[to].cup > edge[to].flow) {
per[edge[to].to] = to;
f[edge[to].to] = min(f[now], edge[to].cup - edge[to].flow);
Q.push(edge[to].to);
}
}
if (f[T])break;
}
if (!f[T])break;
for (now = T; now != S; now = edge[per[now]].from) {
edge[per[now]].flow += f[T];
edge[per[now] ^ 1].flow -= f[T];
}
}
for (int i = 1; i <= n; i++) {
for (auto to : g[i]) {
if (edge[to].flow > 0)maxflow++;
}
}
cout << maxflow << endl;
}
int main() {
int _T = 1;
//cin >> _T;
while (_T--)
solve();
return 0;
}