P10945 Place the Robots
P10945\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU-P10945} }{{\color{Red}\Large Solution} }\mathbf{} {No.4} \end{Bmatrix}\times{}\) NeeDna
这一道题先考虑没有墙的情况,就是二分图的最大独立集合(因为每一行,列只能有一个点)所以把行连向列,做二分图最大匹配,就是答案。
考虑墙的作用 隔开了一行的左右,一列的上下。所以把墙考虑成开了新的一行和列,处理每个的新行,新列即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int f[N][N],ans,cnt1=1,cnt2=1,vis[N],ma[N],n,m,a[N][N],T;
char c[N][N];
int dfs(int x){
for(int i=1;i<=cnt1;i++){
if(vis[i]||!f[x][i]) continue;
vis[i]=1;
if(!ma[i]||dfs(ma[i])){
ma[i]=x;return 1;
}
}
return 0;
}
int main(){
cin>>T;
for(int k=1;k<=T;k++){
cin>>n>>m;ans=0;cnt2=cnt1=1;
memset(f,0,sizeof(f));
memset(ma,0,sizeof(ma));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
if(c[i][j]=='o'){a[i][j]=cnt1;}
if(c[i][j]=='#'){cnt1++;}}cnt1++;}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
if(c[i][j]=='o'){f[cnt2][a[i][j]]=1;}
if(c[i][j]=='#'){cnt2++;}}cnt2++;}
for(int i=1;i<=cnt2;i++){
memset(vis,0,sizeof(vis));
ans+=dfs(i);
}
cout<<"Case :"<<k<<'\n'<<ans<<'\n';
}
return 0;
}

浙公网安备 33010602011771号