http://acm.hdu.edu.cn/showproblem.php?pid=4185
题意即为#可以与上下左右的#形成一个匹配,我们建出符合题意的图即可,记得答案除2
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 600 + 5;
char in[maxn][maxn];
int id[maxn][maxn], tot;
const int maxm = maxn * maxn;
vector<int> G[maxm];
int Mx[maxm], My[maxm];
int dx[maxm], dy[maxm];
int dis;
int uN;
bool used[maxm];
bool SearchP()
{
queue<int>Q;
dis = inf;
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
for(int i = 0 ; i < uN; i++)
if(Mx[i] == -1)
{
Q.push(i);
dx[i] = 0;
}
while(!Q.empty())
{
int u = Q.front();
Q.pop();
if(dx[u] > dis)break;
int sz = G[u].size();
for(int i = 0;i < sz;i++)
{
int v = G[u][i];
if(dy[v] == -1)
{
dy[v] = dx[u] + 1;
if(My[v] == -1)dis = dy[v];
else
{
dx[My[v]] = dy[v] + 1;
Q.push(My[v]);
}
}
}
}
return dis != inf;
}
bool DFS(int u)
{
int sz = G[u].size();
for(int i = 0;i < sz;i++)
{
int v = G[u][i];
if(!used[v] && dy[v] == dx[u] + 1)
{
used[v] = true;
if(My[v] != -1 && dy[v] == dis)continue;
if(My[v] == -1 || DFS(My[v]))
{
My[v] = u;
Mx[u] = v;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int res = 0;
memset(Mx,-1,sizeof(Mx));
memset(My,-1,sizeof(My));
while(SearchP())
{
memset(used,false,sizeof(used));
for(int i = 0;i < uN;i++)
if(Mx[i] == -1 && DFS(i))
res++;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
for(int cas = 1; cas <= T; ++cas) {
int n;
cin >> n;
memset(id, -1, sizeof(id));
tot = 0;
for(int i = 0; i < n; ++i) {
cin >> in[i];
for(int j = 0; j < n; ++j) if(in[i][j] == '#')
id[i][j] = tot++;
}
for(int i = 0; i < tot; ++i) G[i].clear();
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
if(id[i][j] == -1) continue;
if(i + 1 < n && id[i + 1][j] != -1) G[id[i][j]].push_back(id[i + 1][j]);
if(j + 1 < n && id[i][j + 1] != -1) G[id[i][j]].push_back(id[i][j + 1]);
if(i - 1 >= 0 && id[i - 1][j] != -1) G[id[i][j]].push_back(id[i - 1][j]);
if(j - 1 >= 0 && id[i][j - 1] != -1) G[id[i][j]].push_back(id[i][j - 1]);
}
}
uN = tot;
cout << "Case " << cas << ": " << MaxMatch() / 2 << endl;
}
}