1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include <cstdio> #include <vector> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int MAXN = 1e3 + 5; const int MAXM = 25; const int INF = 0x3f3f3f3f;
int n, m, ans, limit[MAXM], p[MAXN][MAXM], match[MAXM][MAXN], cnt[MAXM]; vector<int> G[MAXN]; bool vis[MAXM];
bool dfs(int u) { for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if (vis[v]) continue; vis[v] = 1; if (cnt[v] < limit[v]) { match[v][++cnt[v]] = u; return true; } for (int j = 1; j <= cnt[v]; j++) { if (dfs(match[v][j])) { match[v][j] = u; return true; } } } return false; }
bool check(int l, int r) {
memset(cnt, 0, sizeof(cnt)); memset(match, 0, sizeof(match)); memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) G[i].clear();
for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) if (p[i][j] >= l && p[i][j] <= r) { G[i].push_back(j); } }
for (int i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if (!dfs(i)) return false; }
return true;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) for (int j = 1, x; j <= m; j++) scanf("%d", &x), p[i][x] = j;
for (int i = 1; i <= m; i++) scanf("%d", &limit[i]);
ans = INF; for (int l = 1; l <= m; l++) { for (int r = l; r <= m; r++) {
if (check(l, r)) ans = min(ans, r - l + 1);
} }
printf("%d\n", ans);
return 0; }
|