解题思路:
枚举棋盘上所有格子,如果讲该点删除后,最大匹配数会减少,则该点为关键点。
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <algorithm> using namespace std; const int MAXN = 100 + 10; int G[MAXN][MAXN]; int vis[MAXN]; int match[MAXN]; int n, m, k; int path(int u) { for(int v=1;v<=m;v++) { if(G[u][v] && !vis[v]) { vis[v] = 1; if(match[v] == -1 || path(match[v])) { match[v] = u; return 1; } } } return 0; } int MaxMatch() { int res = 0; memset(match, -1, sizeof(match)); for(int i=1;i<=n;i++) { memset(vis, 0, sizeof(vis)); if(path(i)) res++; } return res; } int main() { int kcase = 1; while(scanf("%d%d%d", &n, &m, &k)!=EOF) { int x, y; memset(G, 0, sizeof(G)); for(int i=1;i<=k;i++) { scanf("%d%d", &x, &y); G[x][y] = 1; } int ans = 0; int acc = MaxMatch(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(G[i][j]) { G[i][j] = 0; if(acc > MaxMatch()) ans++; G[i][j] = 1; } } } printf("Board %d have %d important blanks for %d chessmen.\n", kcase++, ans, acc); } return 0; }
时间: 2024-09-29 03:36:58