题意:
有一副n×mn\times mn×m的表格,如果在(x,y)(x,y)(x,y)放了一枚棋子,与(x,y)(x,y)(x,y)的距离的平方等于555的点不允许放棋子,问最多能放多少个棋子
方法:
二分图染色,一个这样的表格,对于每个点存在且仅存在一组点与这个点有关系,一个表格会被剖分出若干组(可能仅有一组)的点,每个点仅跟组内的点有关系,与组外的点互不相干,那么如果划分出所有组,对每组dfsdfsdfs交替染色,得到每组存在黑色点数tot1tot_{1}tot1,白色点数tot2tot_2tot2,因为每组毫不相干,所以只需要取max(tot1,tot2)max(tot1,tot2)max(tot1,tot2)来放置棋子即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int ans,n,m,tot[2];
int dx[]={1,2};
int dy[]={2,1};
bool color[1005][1005];
void dfs(int x,int y,int c)
{
color[x][y]=true; tot[c]++;
for(int i=0;i<2;i++)
{
for(int j=-1;j<=1;j+=2)
{
for(int k=-1;k<=1;k+=2)
{
int nx=x+dx[i]*j,ny=y+dy[i]*k;
if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&!color[nx][ny]) dfs(nx,ny,c^1);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!color[i][j])
{
tot[0]=tot[1]=0;
dfs(i,j,0);
ans+=max(tot[0],tot[1]);
}
}
}
cout<<ans;
return 0;
}
该博客讨论了一种在n×mn imes mn×m的二维表格中放置棋子的问题,其中每个点与距离其平方等于555的点不能放置棋子。通过采用二分图染色的方法,对表格进行分组并交替染色,求得每组内可放置的最大棋子数。算法实现中使用DFS遍历并计算每组黑白点的数量,最终得出最大放置数量。

被折叠的 条评论
为什么被折叠?



