终于知道为啥网络流这么受欢迎了。

其实就是构个图模板一下的事儿,比较好打是吧。

然后这题网络流黑白染色(其实感觉上匈牙利更加直接好想啊,但是实际上黑白染色给人感觉就是二分图)

st连白而ed连黑,流量为1

不能同时出现的就建无限流量的边

然后sum-最小割

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. const int dx[]={-,-,-,,,,,-};
  9. const int dy[]={-,,,,,-,-,-};
  10.  
  11. struct node
  12. {
  13. int x,y,c,next,other;
  14. }a[];int len,last[];
  15. void ins(int x,int y,int c)
  16. {
  17. int k1,k2;
  18.  
  19. len++;k1=len;
  20. a[len].x=x;a[len].y=y;a[len].c=c;
  21. a[len].next=last[x];last[x]=len;
  22.  
  23. len++;k2=len;
  24. a[len].x=y;a[len].y=x;a[len].c=;
  25. a[len].next=last[y];last[y]=len;
  26.  
  27. a[k1].other=k2;
  28. a[k2].other=k1;
  29. }
  30.  
  31. int st,ed,h[],list[];
  32. bool bt_h()
  33. {
  34. memset(h,,sizeof(h));h[st]=;
  35. int head=,tail=;list[]=st;
  36. while(head!=tail)
  37. {
  38. int x=list[head];
  39. for(int k=last[x];k;k=a[k].next)
  40. {
  41. int y=a[k].y;
  42. if(a[k].c>&&h[y]==)
  43. {
  44. h[y]=h[x]+;
  45. list[tail]=y;
  46. tail++;
  47. }
  48. }
  49. head++;
  50. }
  51. if(h[ed]==)return false;
  52. return true;
  53. }
  54. int findflow(int x,int f)
  55. {
  56. if(x==ed)return f;
  57. int s=;
  58. for(int k=last[x];k;k=a[k].next)
  59. {
  60. int y=a[k].y;
  61. if(a[k].c>&&h[y]==h[x]+&&s<f)
  62. {
  63. int t=findflow(y,min(a[k].c,f-s));
  64. s+=t;a[k].c-=t;a[a[k].other].c+=t;
  65. }
  66. }
  67. if(s==)h[x]=;
  68. return s;
  69. }
  70.  
  71. int n,color[][];
  72. char ss[];
  73. bool mp[][];
  74. int point(int x,int y){return (x-)*n+y;}
  75. int main()
  76. {
  77. scanf("%d",&n);
  78. int br;
  79. int sum=;
  80. for(int i=;i<=n;i++)
  81. {
  82. scanf("%s",ss+);
  83. for(int j=;j<=n;j++)
  84. {
  85. if(ss[j]=='')mp[i][j]=true, sum++;
  86. else mp[i][j]=false;
  87. }
  88. }
  89. //-----sc-----
  90. memset(color,,sizeof(color));
  91. for(int i=;i<=n;i++)
  92. for(int j=;j<=n;j++)
  93. if(j==)color[i][j]=-color[i-][j];
  94. else color[i][j]=-color[i][j-];
  95. //---paint_color---
  96.  
  97. //----init-----
  98.  
  99. st=n*n+,ed=n*n+;
  100. for(int i=;i<=n;i++)
  101. for(int j=;j<=n;j++)
  102. if(mp[i][j]==true)
  103. {
  104. if(color[i][j]==)
  105. ins(st,point(i,j),);
  106. else
  107. ins(point(i,j),ed,);
  108. }
  109. for(int i=;i<=n;i++)
  110. for(int j=;j<=n;j++)
  111. if(mp[i][j]==true&&color[i][j]==)
  112. for(int t=;t<=;t++)
  113. {
  114. int ti=i+dx[t],tj=j+dy[t];
  115. if(ti>&&ti<=n&&tj>&&tj<=n&&mp[ti][tj]==true)
  116. ins(point(i,j),point(ti,tj),);
  117. }
  118.  
  119. //----composition------
  120.  
  121. int ans=;
  122. while(bt_h()==true)
  123. {
  124. ans+=findflow(st,);
  125. }
  126. printf("%d\n",sum-ans);
  127. return ;
  128. }

bzoj3175: [Tjoi2013]攻击装置&&4808: 马的更多相关文章

  1. bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)

    bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋 ...

  2. BZOJ3175: [Tjoi2013]攻击装置

    题解: 最大点独立集...好像水过头了... 不过发现我二分图好像忘完了!!! 代码: #include<cstdio> #include<cstdlib> #include& ...

  3. BZOJ3175 Tjoi2013 攻击装置(二分图匹配)

    传送门 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y ...

  4. BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集

    题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...

  5. BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)

    Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2), ...

  6. 【BZOJ4808/3175】马/[Tjoi2013]攻击装置 最小割

    [BZOJ4808]马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿" ...

  7. 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】

    P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...

  8. BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )

    黑白染成二分图, 然后不能同时选的就连边, 最大匹配数为m, t为不能放的数目, 则题目所求最大点独立集为 n*n-m-t -------------------------------------- ...

  9. 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)

    3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...

随机推荐

  1. java虚拟机(四)--内存溢出、内存泄漏、SOF

    学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了 解内存溢出和内 ...

  2. 01网页<head></head>常用标记及属性

    网页<head></head>常用标记及属性 <!DOCTYPE html> <html> <head> <!--网页标题--> ...

  3. <东方梦符祭> N1无尽30波终于通了

    嘛也算是第一次通关 纪念一下 阵容:xjb搭的杂牌队 主C:古明绝恋 露米娅(真·R卡战神)比那名居天子 斯卡雷特 控制:琪露诺 蕾蒂 灵梦 挂件:小伞 纳兹琳 古明地觉 永江依玖 第一发就直接抽到了 ...

  4. 【转载】linux下的zookeeper启动

    zookeeper的安装目录:/usr/local/zookeeper-3.4.6/bin/zkServer.sh; 配置文件路径:../conf/zoo.cfg 端口 :2181: ZooKeepe ...

  5. java基础学习日志---File方法分析

    package FunDemo; import java.io.File; import java.io.IOException; import java.util.Arrays; public cl ...

  6. 树状数组 & lowbit()

    看了很多大佬的博客,每看一篇博客懂一部分,总算是大概理解了树状数组这个神奇又强大的东西: 在这里我做个整合,把我认为好的部分摘录下来: 参考博客1:https://blog.csdn.net/flus ...

  7. <MySQL>入门二 增删改 DML

    -- DML语言 /* 数据操作的语言 插入:insert 修改:update 删除:delete */ 1.插入 -- 插入语句 /* 语法:insert into 表名(列名...) values ...

  8. 51nod1485 字母排序

    [题解] 开26棵线段数,记录区间内每种字母的出现次数,修改的时候就用区间设置为一个数操作即可.同时也有平衡树做 #include<cstdio> #include<algorith ...

  9. STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)

    本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可. 1.键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样 ...

  10. 【Codeforces 1027D】Mouse Hunt

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 先求出来强连通分量. 每个联通分量里面,显然在联通块的尽头(没有出度)放一个捕鼠夹就ok了 [代码] #include <bits/st ...