#include using namespace std; using ll = long long; const int INF = 1e9 + 10; const ll INFL = 4e18; #include using namespace atcoder; const int MX = 5e5 + 5; int main() { int H, W; cin >> H >> W; vector> A(H, vector(W)); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { cin >> A[i][j]; } } vector>> P(MX); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { P[A[i][j]].push_back({i, j}); } } int ans = 0; for (int i = 1; i < MX; i++) { if (!P[i].empty()) { mf_graph mf(H + W + 2); for (auto [x, y] : P[i]) { mf.add_edge(x, H + y, 1); } for (int j = 0; j < H; j++) { mf.add_edge(H + W, j, 1); } for (int j = 0; j < W; j++) { mf.add_edge(H + j, H + W + 1, 1); } ans += mf.flow(H + W, H + W + 1); } } cout << ans << endl; }