题意:
一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市。
问至少放置多少个基站才能使得所有的城市都覆盖无线?
看本题更详细解法,请戳这里。
#include <iostream>
#include <string.h>
#define N 1150
int linker[N];
bool used[N];
int map[N][N];
int g[N][N];
int uN,vN;
int dire_r[4]={-1,1,0,0};
int dire_c[4]={0,0,-1,1};
bool DFS(int u)
{
int v;
for(v=1;v<=vN;v++)
{
if(g[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||DFS(linker[v]))
{
linker[v]=u;
return true;
}
}
}
return false;
}
int Hungary()
{
int u;
int ret=0;
memset(linker,-1,sizeof(linker));
for(u=1;u<=uN;u++)
{
memset(used,false,sizeof(used));
if(DFS(u)) ret++;
}
return ret;
}
int main()
{
char ch;
int n,m,t;
int i,j,k,p;
std::cin>>t;
while(t--)
{
p=0;
std::cin>>n>>m;
memset(g,0,sizeof(g));
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
std::cin>>ch;
if(ch=='*')
map[i][j]=++p;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(map[i][j])
{
for(k=0;k<4;k++)
{
int x=i+dire_r[k];
int y=j+dire_c[k];
if(map[x][y])
g[map[i][j]][map[x][y]]=1;
}
}
}
}
uN=vN=p;
int ans=Hungary();
std::cout<<uN-ans/2<<std::endl;
}
return 0;
}