题目大意

给定一个 n × m n\times m n×m 的棋盘,棋盘上每个位置要么为空要么为障碍。定义棋盘上两个位置 ( x , y ) , ( u , v ) (x,y),(u,v) (x,y),(u,v)能互相攻击当前仅当满足以下两个条件:
1. x = u x=u x=u或 y = v y=v y=v
2.对于 ( x , y ) (x,y) (x,y)与 ( u , v ) (u,v) (u,v)之间的所有位置,均不是障碍。
现在有 q q q个询问,每个询问给定 m m m,要求从棋盘中选出 m m m个空位置来放棋子,问最少互相能攻击到的棋子对数是多少?

思路:

考虑费用流。对于每一行和每一列,连续没有障碍的格子组成一个连续段。如果当前位置为 ( i , j ) (i,j) (i,j)且不是障碍,则该横连续段向该列连续段连一条容量为1的边,费用为0。代表这里放不会有贡献。
然后源点向所有横连续段建边,边的容量为连续段的大小x,费用为 ( x 2 ) \binom{x}{2} (2x​)。
然后汇点同理。
但显然这样是不行的,因为一个连续段放的棋子个数是不确定的。所以分开建边,建x条边,第i条容量为1,费用为i-1,这样就可以满足 ( x 2 ) \binom{x}{2} (2x​)的条件。
然后每次增加1流量,跑费用流。

c o d e code code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>using namespace std;const int MAXN = 100;int n, m, m2, S, T;
int a[MAXN][MAXN], r[MAXN][MAXN], c[MAXN][MAXN], d[MAXN * MAXN];
int ans[MAXN * MAXN];
int head[MAXN * MAXN], crn[MAXN * MAXN], tot = 1, last[MAXN * MAXN];
int dis[MAXN * MAXN];
struct node {int to, next, w, dis;
}b[MAXN * MAXN * 2];
bool v[MAXN * MAXN];void add(int x,int y,int w,int dis) {b[++ tot] = (node) {y, head[x], w, dis};head[x] = tot;
}bool spfa() {memset(v, 0, sizeof(v));memset(dis, 0x3f3f3f3f3f, sizeof(dis));dis[S] = 0;queue<int> q;q.push(S);while(!q.empty()) {int x = q.front();q.pop();for(int i = head[x]; i; i = b[i].next) {int y = b[i].to;if(b[i].w > 0 && dis[y] > dis[x] + b[i].dis) {dis[y] = dis[x] + b[i].dis;crn[y] = x;last[y] = i;if(!v[y]) v[y] = 1, q.push(y);}}v[x] = 0;}
//  cout<<dis[T]<<endl;return dis[T] != 1061109567;
}void dinic() {int x = 1;while(spfa()) {ans[x] = ans[x - 1] + dis[T];
//      cout<<ans[x]<<endl;for(int i = T; i != S; i = crn[i]) {b[last[i]].w --;b[last[i] ^ 1].w ++;}x ++;if(x > n * n) return ;}
}int main() {freopen("table.in", "r", stdin);freopen("table.out", "w", stdout);scanf("%d", &n);for(int i = 1; i <= n; i ++) {string s;cin>>s;for(int j = 0; j < s.size(); j ++)if(s[j] == '.') a[i][j + 1] = 1;else a[i][j + 1] = -1;}for(int i = 1; i <= n; i ++) {for(int j = 1; j <= n; j ++) {if(a[i][j] == -1) continue;if(a[i][j - 1] != 1) r[i][j] = ++ m;else r[i][j] = r[i][j - 1];}}for(int j = 1; j <= n; j ++) {for(int i = 1; i <= n; i ++) {if(a[i][j] == -1) continue;if(a[i - 1][j] != 1) c[i][j] = ++ m2;else c[i][j] = c[i - 1][j];}}S = 0, T = m + m2 + 1; for(int i = 1; i <= n; i ++)for(int j = 1; j <= n; j ++) {if(a[i][j] == -1) continue;add(r[i][j], c[i][j] + m, 1, 0);add(c[i][j] + m, r[i][j], 0, 0);d[r[i][j]] ++, d[c[i][j] + m] ++;}for(int i = 1; i <= m; i ++)for(int j = 1; j <= d[i]; j ++)add(S, i, 1, j - 1), add(i, S, 0, j - 1);for(int i = m + 1; i <= m + m2; i ++)for(int j = 1; j <= d[i]; j ++)add(i, T, 1, j - 1), add(T, i, 0, j - 1);dinic();int q;scanf("%d", &q);while(q --) {int x;scanf("%d", &x);printf("%d\n", ans[x]);}return 0;
}

【CLYZ集训】催眠大师【费用流】相关推荐

  1. 【YBT2023寒假Day11 B】催眠大师(费用流)

    催眠大师 题目链接:YBT2023寒假Day11 B 题目大意 有一个 n*n 的棋盘,有一些位置有障碍. 然后定义棋盘上两个位置能相互攻击当且仅当在同一行或同一列,且之间的所有位置都没有障碍. 多次 ...

  2. [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]

    题意 题目链接 分析 考虑每个棋子对对应的横向纵向的极大区间的影响:记之前这个区间中的点数为 \(x\) ,那么此次多配对的数量即 \(x\) . 考虑费用流,\(S\rightarrow 横向区间 ...

  3. LP对偶费用流 TopCoder SRM 676 div1 Farmville(最大费用循环流,对偶原理)

    感觉这个年代已经没有人对对偶感兴趣了. 对偶原理与线性规划详见2016集训队论文(没看过而且不知道什么是对偶的可能看不懂我这博客在讲什么) maximizecTxs.t.Ax≤bx≥0\begin{a ...

  4. Codevs 1035 火车停留 [费用流] [拆点]

    1035 火车停留 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description "今天你要去远行,送你风雨中-..",伴 ...

  5. [哈希][费用流]JZOJ 3296 【SDOI2013】刺客信条

    Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的天赋,成为了杰出的刺 ...

  6. [BZOJ 1221][HNOI2001]软件开发(费用流)

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  7. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]

    题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai​现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi​,现在设 D ...

  8. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

  9. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

最新文章

  1. React路由 react-router-dom
  2. 听说苹果M1能打英伟达RTX?那跑个光追试试
  3. spring手动控制事务开启_“上帝视角”图解Spring事务的传播机制原理
  4. BTS3410G参数
  5. VTK:PolyData之MiscPointData
  6. Jmail的使用,可以发送给多人
  7. 数据全裸时代,你的隐私有多容易获取?
  8. OJ1079: a+b(多实例测试2)(C语言数组实现)
  9. 鸿蒙系统-手机-HAP开发编译调试
  10. javascript 之 className属性
  11. mongodb 默认端口号_MongoDB集群方案ReplicaSet
  12. 数据库基础-update语句详解
  13. VS插件AnkhSVN的安装,设置和使用
  14. 一键快速设置图层lisp程序_CAD快速切换图层LISP代码问题
  15. You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).Please, commit your changes
  16. 渗透测试工具篇——sqlmap
  17. 2022年茶艺师(高级)考试题及模拟考试
  18. Python爬取数据存储到本地文本文件
  19. linux文件写入失败 没有空间,write()调用失败:设备上没有剩余空间:ENOSPC处理...
  20. 写个日志请求切面,前后端甩锅更方便

热门文章

  1. 非门,与非门,或非门
  2. Windows 10 UWP/Windows 10 Mobile GIF图片显示
  3. 语音识别入门第一节:语音识别概述
  4. 计算机网口速率修改,openwrt 端口速率设置
  5. Python 文件数据批量录入数据库(MongoDB)
  6. riscv-gnu-toolchain工具链下载安装(unbentu)
  7. [Unity][2D][物理碰撞]同一层级碰撞体忽略碰撞
  8. python编写poc_干货分享丨Python从入门到编写POC之读写文件
  9. 时间反演算符以及对称性
  10. vue多页面应用如何针对其中的某个页面进行单独打包