大意就是在棋子只能放在给定的格子之中,并且在某一格子(x,y)放了棋子后x行,y列不能再放棋子。重要点就是如果某一点不能放棋的话,可以放置棋子的最大数量就会减少。
然后要求第n块棋盘有几个重要点,最多可以放几个棋子
然后比较不同的地方就是求重要点。要用已经求出的最大匹配数 rd 与去掉某点之后的最大匹配数(将map[i][j]=0(屏蔽该点之后再调用函数hugary()))最后不要忘了令map[i][j]=1;进行复原操作。
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int an, bn, N,a,b,ans;int n,m,k;
int map[101][101],linker[101]; bool vis[101][101];
bool dfs(int a) {
for (int b = 1; b <=m; b++) {
if (map[a][b] && !vis[a][b]) {
vis[a][b] = 1;
if (linker[b] ==0 || dfs(linker[b])) {
linker[b] = a;
return true;
}
}
}
return false;
}
int hugary() {
ans = 0;//计数,有多少对
memset(linker, 0, sizeof(linker));
for (int a = 1; a <=n; a++) {
memset(vis, false, sizeof(vis));。
if(dfs(a))ans++;
}
return ans;
}
int main() {
int Count = 0;
while(cin >> n>>m>>k){
memset(map, 0, sizeof(map));
for(int j=0;j<k;j++){
cin >> a >> b;
map[a][b] = 1;
}//输入
Count++;
int rd = hugary(); int nd = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (map[i][j]) {
map[i][j] = 0;
if (rd > hugary()) nd++;
map[i][j] = 1;
}
}
}
cout << "Board " << Count << " have " << nd << " important blanks for " << rd << " chessmen." << endl;
}
}