算法】二分图最大匹配(最大流)

【题解】按(i+j)奇偶性染色后,发现棋子跳到的地方刚好异色。

然后就是二分图了,对于每个奇点向可以跳到的地方连边,偶点不需连(可逆)。

所以题目要求转换为求二分图上最大独立集(对于每条边,至少有一个点不被选中)。

最大独立集=总点数-最小割

//代码略
//hzwer's code: #include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x7fffffff
using namespace std;
int n,m,bl,wt,ans,cnt=;
bool del[][];
int mark[][];
int xx[]={,,,,-,-,-,-},
yy[]={,-,,-,,-,,-};
struct data{int to,next,v;}e[];
int head[],h[];
void insert(int u,int v,int w)
{
cnt++;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
e[cnt].v=w;
cnt++;
e[cnt].to=u;
e[cnt].next=head[v];
head[v]=cnt;
}
void build()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(del[i][j])continue;
else if(mark[i][j]<bl)
{
for(int k=;k<;k++)
{
int nowx=i+xx[k],nowy=j+yy[k];
if(nowx<||nowy<||nowx>n||nowy>n||del[nowx][nowy])continue;
insert(mark[i][j],mark[nowx][nowy],INF);
}
insert(,mark[i][j],);
}
else insert(mark[i][j],wt,);
}
bool bfs()
{
int q[],t=,w=,i,now;
memset(h,-,sizeof(h));
h[]=q[]=;
while(t<w)
{
now=q[t];t++;
i=head[now];
while(i)
{
if(h[e[i].to]==-&&e[i].v){h[e[i].to]=h[now]+;q[w++]=e[i].to;}
i=e[i].next;
}
}
if(h[wt]==-)return ;
return ;
}
int dfs(int x,int f)
{
if(x==wt)return f;
int i=head[x];
int w,used=;
while(i)
{
if(e[i].v&&h[e[i].to]==h[x]+)
{
w=f-used;
w=dfs(e[i].to,min(w,e[i].v));
e[i].v-=w;
e[i^].v+=w;
used+=w;
if(used==f)return f;
}
i=e[i].next;
}
if(!used)h[x]=-;
return used;
}
void dinic(){while(bfs()){ans+=dfs(,INF);}}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
del[x][y]=;
}
bl=,wt=(n*n+)/+;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if((i+j)%==){mark[i][j]=bl;bl++;}
else {mark[i][j]=wt;wt++;}
build();
dinic();
printf("%d",n*n-m-ans);
return ;
}

最新文章

  1. 多值(in),范围值(between..and)
  2. Linux远程执行Shell命令或脚本
  3. java获取路径的方法
  4. 我也来写:数据库访问类DBHelper(转)
  5. GOF业务场景的设计模式-----责任链模式
  6. codeforces 515B. Drazil and His Happy Friends 解题报告
  7. 15 sql base line 工作机制
  8. C++面向过程解决三阶行列式问题
  9. rtsp实时流通过rtmp推送到服务端
  10. 心情记录&amp;考试总结 3.30
  11. MyBatis 的Mapper中有小于号的处理
  12. Python练习2
  13. 一个题目涉及到的50个Sql语句
  14. Java开发知识之Java的集成开发环境
  15. gcd和lcm模板
  16. Springmvc配置时间日期转换
  17. 深入浅出javascript(十二)继承——构造函数继承和组合继承
  18. PHP 图片处理类 错误处理方法:
  19. python+selenium:iframe框架中多种定位
  20. eclipse 配置动态web项目在servers中运行

热门文章

  1. 在原有的基础之上,启用NAT模型
  2. CCF——数位之和201512-1
  3. SSH框架配置
  4. javascript 排序
  5. jumpserver的安装部署
  6. Asp.net MVC 获取IPv4 地址
  7. 【Java并发编程】之三:线程挂起、恢复与终止的正确方法
  8. Race to 1 UVA - 11762 (记忆dp概率)
  9. 洛谷 P4219 [BJOI2014]大融合 解题报告
  10. 【bzoj2500】幸福的道路