小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。
所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么?
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
const int MAXN = 100 + 10;
int n, m, k;
int c[MAXN][MAXN];
int match[MAXN];
bool vis[MAXN];
bool dfs(int u)
{
for (int i = 1; i <= m; i++)
{
if (!vis[i] && c[u][i])
{
vis[i] = true;
if (match[i] == -1 || dfs(match[i]))
{
match[i] = u;
return true;
}
}
}
return false;
}
int solve()
{
int res = 0;
memset(match, -1, sizeof(match));
for (int i = 1; i <= n; i++)
{
memset(vis, false, sizeof(vis));
if (dfs(i))
{
res++;
}
}
return res;
}
void input()
{
int cases = 0;
while (cin >> n >> m >> k)
{
int u, v;
memset(c, 0, sizeof(c));
for (int i = 0; i < k; i++)
{
scanf("%d %d", &u, &v);
c[u][v] = 1;
}
int maxs = 0, num = 0;
maxs = solve();
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (c[i][j])
{
c[i][j] = 0;
if (solve() < maxs)
{
num++;
}
c[i][j] = 1;
}
}
}
cout << "Board " << ++cases << " have " << num << " important blanks for " << maxs << " chessmen." << endl;
}
}
int main()
{
input();
return 0;
}