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

【题解】按(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 ;
}

【CODEVS】1922 骑士共存问题的更多相关文章

  1. codevs 1922 骑士共存问题 网络流

    题目链接 给一个n*n的棋盘, 上面有障碍物, 有障碍物的不能放东西.然后往上面放马, 马不能互相攻击, 问最多可以放多少个马. 按x+y的奇偶来划分, 如果两个格子可以互相攻击, 就连一条权值为1的 ...

  2. 【wikioi】1922 骑士共存问题(网络流/二分图匹配)

    用匈牙利tle啊喂?和网络流不都是n^3的吗(匈牙利O(nm), isap O(n^2m) 但是isap实际复杂度很优的(二分图匹配中,dinic是O(sqrt(V)*E),不知道isap是不是一样. ...

  3. Codevs1922 骑士共存问题

    1922 骑士共存问题 题目描述 Description 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国 ...

  4. COGS746. [网络流24题] 骑士共存

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  5. P3355 骑士共存问题

    P3355 骑士共存问题 题目描述 在一个 n*n (n <= 200)个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n ...

  6. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  7. AC日记——[网络流24题]骑士共存 cogs 746

    746. [网络流24题] 骑士共存 ★★☆   输入文件:knight.in   输出文件:knight.out   简单对比时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: ...

  8. [网络流24题] 骑士共存(cogs 746)

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  9. [网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)

    洛谷传送门 LOJ传送门 和太空飞行计划问题一样,这依然是一道最大权闭合图问题 “骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法 分析题目,如果我们能把所有方格的数都给 ...

随机推荐

  1. Java中按值传递与按引用传递的区别

    值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...

  2. Kotlint集合简单总结

    1.数组操作 var testArray = Array<>("s","ss")或者 = arrayOf("s","s ...

  3. 对scrum站立会议的理解

    个人理解:首先我不明白scrum的含义,查了一下,scrum是迭代式增量软件开发过程,通常用于敏捷开发.scrum包括了一系列实践和预定义角色的过程骨架.scrum中的主要角色包括同项目经理类似的sc ...

  4. php中ob缓存机制

    1.ob缓存运行方式 2.注意:在程序中如果开启ob_start(),所有的echo输出都会保存到ob缓存中,可以使用ob系列函数进行操作,如果没有,默认情况下,在程序执行结束,会把缓存中的数据发送给 ...

  5. PHP中普通方法和静态方法

    普通方法(实例方法) 一个类中定义的方法,可以为这个类的所有对象调用的方法.也可以理解为,这个类的所有对象,都各自有自己的一个该方法: 定义形式: class  类名{ function  方法名(形 ...

  6. 第180天:HTML5——本地存储

    本地存储 客户端存储数据的方法 cookie 方法 localStorage方法 sessionStorage方法 一.localStorage 1.存储特点: localStorage方法存储的数据 ...

  7. HttpWebRequest和HttpWebResponse的应用

    创建使用类HttpHelper: public class Httpparam { public string UserAgent { get; set; } public string Accept ...

  8. Socket 传一幅图片给另一个终端

    练习Socket传文件,先添加一个组件,简化socket发送和接收文件, 获取IP和端口的类 public static class AddressHelper { /// <summary&g ...

  9. 对Spark2.2.0文档的学习3-Spark Programming Guide

    Spark Programming Guide Link:http://spark.apache.org/docs/2.2.0/rdd-programming-guide.html 每个Spark A ...

  10. 除了GPS外的4种获得用户地理位置数据的方法

    纯粹的GPS解决方案以及它所生成的经纬度标签是地理位置数据的公认标准.但是至少还有4种方法可以获得地理位置数据: 1.手机信号塔数据:当移动设备的GPS芯片不能接收到GPS信号时,移动设备就需要与它所 ...