首页 > 其他分享 >BZOJ 4808(马-二分图最大独立集)

BZOJ 4808(马-二分图最大独立集)

时间:2022-10-24 18:02:59浏览次数:54  
标签:二分 include return weight 4808 long int BZOJ define


4808: 马
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 111 Solved: 46
[Submit][Status][Discuss]
Description
众所周知,马后炮是中国象棋中很厉害的一招必杀技。”马走日字”。本来,如果在要去的方向有别的棋子挡住(俗
称”蹩马腿”),则不允许走过去。为了简化问题,我们不考虑这一点。马跟马显然不能在一起打起来,于是rly在
一天再次借来了许多许多的马在棋盘上摆了起来……但这次,他实在没兴趣算方案数了,所以他只想知道在N×M的
矩形方格中摆马使其互不吃到的情况下的最多个数。但是,有一个很不幸的消息,rly由于玩得太Happy,质量本来
就不好的棋盘被rly弄坏了,不过幸好只是破了其中的一些格子(即不能再放子了),问题还是可以继续解决的。

Input
一行,两个正整数N和M。
接下来N行,每行M个数,要么为0,表示没坏,要么为1,表示坏了。
N<=200,M<=200

Output
一行,输出最多的个数。

Sample Input
2 3

0 1 0

0 1 0

Sample Output
2
HINT

Source

By FancyCoder

棋盘黑白染色,约束变为若干(黑,白)对点不能同时取

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
class Max_flow //dinic+当前弧优化
{
public:
int n,t;
int q[MAXN];
int edge[MAXM],Next[MAXM],Pre[MAXN],weight[MAXM],size;
void addedge(int u,int v,int w)
{
edge[++size]=v;
weight[size]=w;
Next[size]=Pre[u];
Pre[u]=size;
}
void addedge2(int u,int v,int w){addedge(u,v,w),addedge(v,u,0);}
bool b[MAXN];
int d[MAXN];
bool SPFA(int s,int t)
{
For(i,n) d[i]=INF;
MEM(b)
d[q[1]=s]=0;b[s]=1;
int head=1,tail=1;
while (head<=tail)
{
int now=q[head++];
Forp(now)
{
int &v=edge[p];
if (weight[p]&&!b[v])
{
d[v]=d[now]+1;
b[v]=1,q[++tail]=v;
}
}
}
return b[t];
}
int iter[MAXN];
int dfs(int x,int f)
{
if (x==t) return f;
Forpiter(x)
{
int v=edge[p];
if (weight[p]&&d[x]<d[v])
{
int nowflow=dfs(v,min(weight[p],f));
if (nowflow)
{
weight[p]-=nowflow;
weight[p^1]+=nowflow;
return nowflow;
}
}
}
return 0;
}
int max_flow(int s,int t)
{
(*this).t=t;
int flow=0;
while(SPFA(s,t))
{
For(i,n) iter[i]=Pre[i];
int f;
while (f=dfs(s,INF))
flow+=f;
}
return flow;
}
void mem(int n)
{
(*this).n=n;
size=1;
MEM(Pre)
}
}S;
int n,m;
int dx[8]={1,2,1,-2,-1,2,-1,-2};
int dy[8]={2,1,-2,1,2,-1,-2,-1};
bool inside(int i,int j) {
return 1<=i&&i<=n&&1<=j&&j<=m;
}
int id(int i,int j) {
return (i-1)*m+j;
}
int main()
{
// freopen("bzoj4808.in","r",stdin);
// freopen(".out","w",stdout);
n=read(),m=read();
int a[300][300];
int s=n*m+1,t=s+1;
S.mem(t);
int ans=0;
For(i,n) For(j,m) a[i][j]=read();
For(i,n) {
For(j,m) {
if (a[i][j]==0) {
++ans;
if ((i+j)&1) S.addedge2(s,id(i,j),1);
else S.addedge2(id(i,j),t,1);
Rep(k,8) {
int nx=i+dx[k];
int ny=j+dy[k];
if (inside(nx,ny)) if (!a[nx][ny]){
if ((i+j)&1) S.addedge2(id(i,j),id(nx,ny),1);
else S.addedge2(id(nx,ny),id(i,j),1);
}
}
}
}
}
cout<<ans-S.max_flow(s,t)<<endl;
return 0;
}


标签:二分,include,return,weight,4808,long,int,BZOJ,define
From: https://blog.51cto.com/u_15724837/5790756

相关文章

  • BZOJ 4807(車-高精度)
    Description众所周知,車是中国象棋中最厉害的一子之一,它能吃到同一行或同一列中的其他棋子。車跟車显然不能在一起打起来,于是rly一天又借来了许多许多的車在棋盘上摆了起......
  • BZOJ 4805(欧拉函数求和-杜教筛)
    Description给出一个数字N,求sigma(phi(i)),1<=i<=NInput正整数N。N<=2*10^9Output输出答案。SampleInput10SampleOutput32HINT杜教筛入门#include<bits/stdc++......
  • BZOJ 4810([Ynoi2017]由乃的玉米田-莫队)
    Description由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美。这排玉米一共有N株,它们的高度参差不齐。由乃认为玉米田不美,所以她决定出个数据结构题这个题是这......
  • BZOJ 3503([Cqoi2014]和谐矩阵-gauss消元)
    Description我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果存在)。给定矩阵的行数和......
  • 手动实现前馈神经网络解决二分类问题
    2、手动实现前馈神经网络解决二分类问题#导入必要的包importnumpyasnpimporttorchfromtorchimportnnfromsklearn.model_selectionimporttrain_test_spliti......
  • 利用torch.nn实现前馈神经网络解决二分类问题
    5、利用torch.nn实现前馈神经网络解决二分类问题#导入必要的包importtorchimporttorch.nnasnnfromtorch.utils.dataimportTensorDataset,DataLoaderfromtorc......
  • 对二分类模型采用十折交叉验证评估
    14、对二分类模型采用十折交叉验证评估#导入必要的包importtorchimporttorch.nnasnnfromtorch.utils.dataimportTensorDataset,DataLoaderfromtorch.nnimpo......
  • 886. 可能的二分法 : 判定二分图模板题
    题目描述这是LeetCode上的886.可能的二分法,难度为中等。Tag:「二分图」、「染色法」、「并查集」、「DFS」给定一组 ​​n​​​ 人(编号为 ​​1,2,...,n​​......
  • 二分图
    判定一张图是二分图,当且仅当图中不存在奇环。如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点。例题:关押罪犯......
  • 二分查找法
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ intarr[]={1,2,3,4,5,6,7,8,9,10}; intk=7; intsz=sizeof(arr)/sizeof(arr[0]); int......