P2825 [HEOI2016/TJOI2016]游戏

↘锁芯ラ 提交于 2019-11-27 15:20:32

题目描述

详见  P2825 [HEOI2016/TJOI2016]游戏

solution

套路题。

一般思路是行列建点跑二分图最大匹配。

此题中的#会分隔行列,因此我们把每行的极大联通块设为点,列同理建点。

再对于每个*对应的行的极大联通块与列的最大联通块编号连边,跑最大匹配即可。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=55;
vector<int> e[MAXN*MAXN];
bool vis[MAXN*MAXN];
char st[MAXN];
int flag[MAXN][MAXN];
int color1[MAXN][MAXN],color2[MAXN][MAXN],X[MAXN*MAXN],Y[MAXN*MAXN];
inline int read()
{
	int f=1,x=0; char c=getchar();
	while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }
	while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }
	return x*f;
}
bool check(int u)
{
	for (int i=0;i<e[u].size();i++)
	{
		int to=e[u][i];
		if (vis[to]) continue;
		vis[to]=1;
		if (X[to]==-1||check(X[to])) { X[to]=u,Y[u]=to; return 1; }
	}
	return 0;
}
int main()
{
	int n=read(),m=read(),colornum=1,num=0;
	for (int i=1;i<=n;i++)
	{
		scanf("%s",st);
		for (int j=0;j<m;j++)
		{
			if (st[j]=='*') flag[i][j+1]=0;
			if (st[j]=='x') flag[i][j+1]=1;
			if (st[j]=='#') flag[i][j+1]=2;
		}
	}
	for (int i=1;i<=n;i++)
	{
		if (num>0) colornum++,num=0;
		for (int j=1;j<=m;j++)
		if (flag[i][j]==2&&num>0) num=0,colornum++; 
		else if (flag[i][j]==2) color1[i][j]=0;
		else num++,color1[i][j]=colornum;
	}
	for (int i=1;i<=m;i++)
	{
		if (num>0) colornum++,num=0;
		for (int j=1;j<=n;j++)
		if (flag[j][i]==2&&num>0) num=0,colornum++;
		else if (flag[j][i]==2) color2[j][i]=0;
		else num++,color2[j][i]=colornum;
	}
	for (int i=1;i<=n;i++)
	    for (int j=1;j<=m;j++)
	    if (flag[i][j]==0) e[color1[i][j]].push_back(color2[i][j]);
	    
	/*
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++) cout<<setw(3)<<color1[i][j];
		cout<<endl;
	}
	cout<<endl;
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++) cout<<setw(3)<<color2[i][j];
		cout<<endl;
	}
	*/
	
	int ans=0;
	for (int i=1;i<=colornum;i++) X[i]=Y[i]=-1;
	for (int i=1;i<=colornum;i++) 
	{
		memset(vis,0,sizeof vis);
		ans+=check(i);
	}
	printf("%d\n",ans);
	return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!