这题一开始真的不知道该怎么建图,由此出现了一系列的问题。
题目大意:
一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市。问至少放置多少个基站才能使得所有的城市都覆盖无线?
还要考虑到匹配不到的点,最后答案就成了:所有点数-匹配数/2。
下面是代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int M=405;
int n,k,map1[M][M],vis[M],link[M],m,cut1[M][M];
bool dfs(int x)
{
for(int y=1; y<=n; y++)
{
if(map1[x][y] && !vis[y])
{
vis[y]=true;
if(link[y]==0 || dfs(link[y]))
{
link[y]=x;
return true;
}
}
}
return false;
}
void hungray()
{
int i;
for(i=1; i<=n; i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i))
{
m++;
}
}
}
int main()
{
int t,w,h;
scanf("%d",&t);
char s;
while(t--)
{
int i,j,cut=0;;
scanf("%d%d",&h,&w);
memset(map1,0,sizeof(map1));
memset(cut1,0,sizeof(cut1));
memset(link,0,sizeof(link));
for(i=0; i<h; i++)
{
for(j=0; j<w; j++)
{
cin >> s;
if(s=='*')
{
cut++;
cut1[i][j]=cut;
}
}
}
n=cut;
for(i=0; i<h; i++)
{
for(j=0; j<w; j++)
{
if(cut1[i][j]!=0)
{
if(i>0&&cut1[i-1][j]!=0)
{
map1[cut1[i][j]][cut1[i-1][j]]=1;
}
if(i<h-1&&cut1[i+1][j]!=0)
{
map1[cut1[i][j]][cut1[i+1][j]]=1;
}
if(j>0&&cut1[i][j-1]!=0)
{
map1 [cut1[i][j]] [cut1[i][j-1]] =1;
}
if(j<w-1&&cut1[i][j+1]!=0)
{
map1 [cut1[i][j]] [cut1[i][j+1]] =1;
}
}
}
}
m=0;
hungray() ;
printf("%d\n",cut-m/2);
}
return 0;
}