骑士共存问题
«问题描述:
在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘

上某些方格设置了障碍,骑士不得进入。

«编程任务:
对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑
士,使得它们彼此互不攻击。
«数据输入:
由文件knight.in给出输入数据。第一行有2 个正整数n 和m (1<=n<=200, 0<=m<=n*n)<n2),< span="">
分别表示棋盘的大小和障碍数。接下来的m 行给出障碍的位置。每行2 个正整数,表示障
碍的方格坐标。
«结果输出:
将计算出的共存骑士数输出到文件knight.out。
输入文件示例 输出文件示例
knight.in
3 2
1 1

3 3

knight.out

5

  1. /*
  2. 观察题目,我们可以知道,能够互相跳到的两个点颜色(棋盘颜色)一定是不同的,所以进行染色建一个二分图, 接下来再跑最大独立集。
  3. 最大独立集=V-最大匹配。
  4. PS:我的dinic又被虐了,以后真的要改dinic的写法了。
  5. */
  6. #include<cstdio>
  7. #include<iostream>
  8. #define N 40010
  9. #define M 10000010
  10. #define inf 1000000000
  11. using namespace std;
  12. int a[][],head[N],dis[N],q[N],n,m,cnt=,S,T;
  13. int dx[]={,,-,-,,,-,-};
  14. int dy[]={,-,,-,,-,,-};
  15. struct node{
  16. int v,pre,f;
  17. };node e[M];
  18. int ws(int x,int y){
  19. return (x-)*n+y;
  20. }
  21. void add(int u,int v,int f){
  22. e[++cnt].v=v;e[cnt].f=f;e[cnt].pre=head[u];head[u]=cnt;
  23. e[++cnt].v=u;e[cnt].f=;e[cnt].pre=head[v];head[v]=cnt;
  24. }
  25. bool bfs(){
  26. for(int i=;i<=T;i++)dis[i]=inf;
  27. int h=,t=;q[]=S;dis[S]=;
  28. while(h<t){
  29. int now=q[++h];
  30. for(int i=head[now];i;i=e[i].pre){
  31. int v=e[i].v;
  32. if(e[i].f&&dis[v]>dis[now]+){
  33. dis[v]=dis[now]+;
  34. if(v==T)return true;
  35. q[++t]=v;
  36. }
  37. }
  38. }
  39. return dis[T]!=inf;
  40. }
  41. int dinic(int now,int f){
  42. if(now==T)return f;
  43. int w,used=;
  44. for(int i=head[now];i;i=e[i].pre){
  45. int v=e[i].v;
  46. if(e[i].f&&dis[v]==dis[now]+){
  47. w=f-used;
  48. w=dinic(e[i].v,min(e[i].f,w));
  49. e[i].f-=w;
  50. e[i^].f+=w;
  51. used+=w;
  52. if(used==f)return f;
  53. }
  54. }
  55. if(!used) dis[now]=-;
  56. return used;
  57. }
  58. int main(){
  59. freopen("knight.in","r",stdin);
  60. freopen("knight.out","w",stdout);
  61. scanf("%d%d",&n,&m);
  62. S=;T=n*n+;
  63. for(int i=;i<=m;i++){
  64. int x,y;scanf("%d%d",&x,&y);
  65. a[x][y]=;
  66. }
  67. for(int i=;i<=n;i++)
  68. for(int j=;j<=n;j++){
  69. if(a[i][j])continue;
  70. if(i+j&) add(ws(i,j),T,);
  71. else add(S,ws(i,j),);
  72. }
  73. for(int i=;i<=n;i++)
  74. for(int j=;j<=n;j++){
  75. if(i+j&) continue;
  76. for(int k=;k<;k++){
  77. int x=i+dx[k],y=j+dy[k];
  78. if(x>=&&x<=n&&y>=&&y<=n&&!a[x][y])
  79. add(ws(i,j),ws(x,y),);
  80. }
  81. }
  82. int ans=n*n-m;
  83. while(bfs()) ans-=dinic(S,inf);
  84. printf("%d",ans);
  85. return ;
  86. }

[网络流24题] 骑士共存(cogs 746)的更多相关文章

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

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

  2. Cogs 746. [网络流24题] 骑士共存(最大独立集)

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

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

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

  4. 网络流24题 骑士共存(DCOJ8023)

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

  5. 网络流24题——骑士共存问题 luogu 3355

    题目描述:这里 从这里开始,我们涉及到了一个新的问题:最小割问题 首先给出一些定义(本人根据定义自己口胡的): 一个流网络中的一个割是一个边集,使得割掉这些边集后源点与汇点不连通 而最小割问题就是一个 ...

  6. 【费用流】【网络流24题】【cogs 739】运输问题

    739. [网络流24题] 运输问题 ★★ 输入文件:tran.in 输出文件:tran.out 简单对照 时间限制:1 s 内存限制:128 MB «问题描写叙述: «编程任务: 对于给定的m 个仓 ...

  7. [网络流24题]餐巾(cogs 461)

    [问题描述] 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分 ...

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

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

  9. Cogs 14. [网络流24题] 搭配飞行员

    这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...

随机推荐

  1. HDU 5996 博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=5996 博弈论待补. 这题变化了一下,因为注意到奇数层的东西(层数从1开始),对手可以模仿地动,那就相当于没动. ...

  2. 一个页面通过iframe,获取另一个页面的form

    document.getElementsByTagName("iframe")[0].contentWindow.document.forms[0].submit(); var z ...

  3. 静态代理,jdbc动态代理和cglib动态代理

    静态代理 1.定义抽象主题接口. package com.zhangguo.Spring041.aop02; /** * 接口 * 抽象主题 */ public interface IMath { / ...

  4. java基础(六):RabbitMQ 入门

    建议先了解为什么项目要使用 MQ 消息队列,MQ 消息队列有什么优点,如果在业务逻辑上没有此种需求,建议不要使用中间件.中间件对系统的性能做优化的同时,同时增加了系统的复杂性也维护难易度:其次,需要了 ...

  5. Python学习 Day 4 函数 切片 迭代 列表生成式 生成器

    定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...

  6. Log4net快速搭建

    nuget安装log4net 2018.12.10当前版本为2.0.8 找到所在项目的[Properties->AssemblyInfo] 在底部加上 [assembly: log4net.Co ...

  7. MySQL for Mac 终端操作说明

    mysql for mac 终端操作说明MySQL服务开启Mac版mysql可以从设置里启动服务: 如果想要在终端(Terminal)中操作mysql,需要先添加mysql路径,在此以zsh为例: # ...

  8. winpcap编程设置过滤器之指定获取某个网站的数据

    下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据. 游戏图: 我是乱世隋唐的网址是:www.917st.com 这个是官网网址的服务器地址.  42.62.0.14 我玩的游戏服是84区.网 ...

  9. 删除目录文件夹时出现:rm: cannot remove `/data/wwwroot/backidc': Is a directory

    rm -f 删除目录文件夹时出现:rm: cannot remove `/data/wwwroot/backidc': Is a directory cannot remove is a direct ...

  10. CAD参数绘制直线(com接口)

    用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...