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;
}
posted @ 2025-05-30 20:32  NeeDna  阅读(12)  评论(0)    收藏  举报