[Wf2011]Chips Challenge(最小费用最大流)

[Wf2011]Chips Challenge

  • problem
  • solution
  • code

problem

BZOJ2673

solution

.

首先得知道这是网络流,但真的看不出来啊!!我真的郁闷啊( ̄﹏ ̄;)

在知道做法是网络流后,初读题,肯定会想到将行列分左右点,[1,n][1,n][1,n]表示行,[n+1,2n][n+1,2n][n+1,2n]表示列。

然后就发现举步维艰,因为题目要维护的两个条件都不是很好操作。

iiiiii 列零件数一样,且每行零件数不能超过总数的 AB\frac{A}{B}BA

这两个限制条件都没有明确具体零件个数要求,是随着全局动态变化的。

所以无法变成网络流上的容量限制。

唯一知道的限制就是每行每列可放芯片的最大数量。

【可放指的是 . /C 的点】

注意到 nnn 的限制很小,不妨考虑枚举每行可放零件的最大值个数 MaxMaxMax

如果能通过网络流求出总零件数量 tottottot,就可以逆向判断 Max≤ABtot⇒Max∗B≤A∗totMax\le \frac{A}{B}tot\Rightarrow Max*B\le A*totMaxBAtotMaxBAtot

而网络流是最大流,是尽量做到流满的,所以 tottottot 一定会尽可能的大。

增长同向平行,最大流就是在做尽量满足判断式子的过程。

所以如果最大流的结果还是不满足上面的不等式,只能说明 MaxMaxMax 不是合法的。

自然地想到,对于可放芯片的位置 (i,j)(i,j)(i,j) 进行 iii 行向 jjj 列连边,容量为 111

这样去跑网络流,跑出的最大流确实是最多能放的芯片数量,但是这样并没有考虑到 iiiiii 列相等的限制。

因为不能知道第 iii 行和第 iii 列具体放了多少个芯片,没有明确的容量限制。

但是转化一下,第 iii 行放了芯片的位置和第 iii 列没放芯片的位置加起来一共是等于 nnn 的。

所以想到新建一个连接点 kkk,分别让行列点向 kkk 连边。

行连接的边流过的流量来表示行放芯片的个数,列连接的边流过的流量来表示列不放芯片的个数。

行列与 kkk 之间的边容量设为 ∞∞

然后连接点向 ttt 连边,容量为 nnn,保证 k→tk\rightarrow tkt 的边满流即可。

因为这样代表着第 iii 行放的个数和第 iii 列不放的个数加在一起是等于 nnn 的,变相地满足第 iii 行和第 iii 列个数相同的限制。

但是怎么能一些边流了表示不选,一些边流了表示要选。最大流上面看到了是不能做到的,那就只能考虑最小费用了。

iii 流给连接点 kkk 的表示要放的芯片,列 iii 流给 kkk 的表示不放的芯片,所以 i→ji\rightarrow jij 这种流给其它列点就应当表示 (i,j)(i,j)(i,j) 不放芯片,所以只有 iiijjj 列是 . 才有选择不放的可能。

为了记录这样的边流了多少,就把这种边带上费用 111,跑最小费用就是尽可能减少不放的,即最大化放的芯片。

除了这样的边,其余边费用就为 000,属于要跑最大流。

别忘了,一开始枚举的每行放芯片个数的限制,所以行与连接点之间的容量应该修改为 MaxMaxMax

注意到,现在的网络还有一个冗余的地方,列 iii 的出边只有连接点 kkk,且容量为 ∞∞,所以可以将列 iii 与连接点进行合并。

那么现在的网络,行 iii 的流量只有两种去向:经过列 iii 最多流 MaxMaxMax 个,剩下的都是流到其他列 jjj 地方,表示不放芯片,且带有费用 111

最后最大流减去最小费用就是真正放的芯片个数,再减去一定放的 C 个数就是新放的芯片个数。

最后记得还有行列分别与源汇的连边。

通过 s→is\rightarrow isi 容量为第 iii 行可放的芯片数量来限制第 iii 行放置的个数。

通过 j→tj\rightarrow tjt 容量为第 jjj 列可放的芯片数量来限制第 jjj 列放置的个数。【准确来说是 j+n→tj+n\rightarrow tj+nt,大家意会就行】

最后让这个网络满流即可。

总结一下建图过程:
{s→irowi,0i+n→ncoli,0i→j+n1,1(ch[i][j]=′.′)i→i+nMax,0\begin{cases}s\rightarrow i\quad \quad \quad row_i,0\\i+n\rightarrow n\quad col_i,0\\i\rightarrow j+n\quad 1,1\ (ch[i][j]='.')\\i\rightarrow i+n\quad Max,0\end{cases} sirowi,0i+nncoli,0ij+n1,1 (ch[i][j]=.)ii+nMax,0

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 105
#define maxm 5005
int n, a, b, s, t, cnt;
bool vis[maxn];
char ch[maxn][maxn];
int dis[maxn], head[maxn], lst[maxn], row[maxn], col[maxn];
struct node { int to, nxt, flow, w; }E[maxm];
queue < int > q;void addedge( int u, int v, int flow, int w ) {E[cnt] = { v, head[u], flow, w };head[u] = cnt ++;E[cnt] = { u, head[v], 0, -w };head[v] = cnt ++;
}bool spfa() {memset( dis, 0x7f, sizeof( dis ) );memset( lst, -1, sizeof( lst ) );dis[s] = 0; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop(); vis[u] = 0;for( int i = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( dis[v] > dis[u] + E[i].w and E[i].flow ) {dis[v] = dis[u] + E[i].w;lst[v] = i;if( ! vis[v] ) vis[v] = 1, q.push( v );}}}return ~ lst[t];
}void MCMF( int &flow, int &cost ) {flow = cost = 0;while( spfa() ) {int Min = 1e9;for( int i = lst[t];~ i;i = lst[E[i ^ 1].to] )Min = min( Min, E[i].flow );for( int i = lst[t];~ i;i = lst[E[i ^ 1].to] )cost += E[i].w * Min, E[i].flow -= Min, E[i ^ 1].flow += Min;flow += Min;}
}int main() {int Case = 0;while( ~ scanf( "%d %d %d", &n, &a, &b ) ) {if( ! n and ! a and ! b ) break;memset( row, 0, sizeof( row ) );memset( col, 0, sizeof( col ) );s = 0, t = n << 1 | 1;int sum = 0, used = 0;for( int i = 1;i <= n;i ++ ) {scanf( "%s", ch[i] + 1 );for( int j = 1;j <= n;j ++ )if( ch[i][j] != '/' ) {sum ++, row[i] ++, col[j] ++;used += ch[i][j] == 'C';}}int ans = -1;for( int Max = 0, flow, cost;Max <= n;Max ++ ) {memset( head, -1, sizeof( head ) ); cnt = 0;for( int i = 1;i <= n;i ++ ) {addedge( s, i, row[i], 0 );addedge( i + n, t, col[i], 0 );addedge( i, i + n, Max, 0 );for( int j = 1;j <= n;j ++ )if( ch[i][j] == '.' ) addedge( i, j + n, 1, 1 );}MCMF( flow, cost );if( flow == sum and Max * b <= ( sum - cost ) * a )ans = max( ans, sum - cost );}printf( "Case %d: ", ++ Case );if( ~ ans ) printf( "%d\n", ans - used );else printf( "impossible\n" );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识&#xff0c;最近又有两家俱乐部上线了&#xff08;东莞与长沙&#xff09;&#xff0c;俱乐部的活动告一段落&#xff0c;接下来的日子里我将持续与大家分享 Office 365 的精彩内容&#xff0c;这次很…

BZOJ4294 : [PA2015]Fibonacci(dfs、暴力、数位dp)

解析 新定义数位dp了属于是。 结论&#xff1a;斐波拉契在模 10m10^m10m 的意义下循环节为 6*10^m。 但这个不一定是最小循环节&#xff0c;我自己做的时候打表得出来的循环节更小。 考虑从低到高枚举周期中的位置&#xff0c;暴力check合法进行剪枝。 跑的飞快&#xff0c;O…

Chip Factory HDU - 5536

Chip Factory HDU - 5536 题意&#xff1a; 给你n个数&#xff0c;让你从中选出i&#xff0c;j&#xff0c;k三个下标&#xff0c;求最大的 &#xff08;a[i]a[j]&#xff09;^ a[k] 题解&#xff1a; 这种查找最大异或一般有两个方向&#xff0c;一个是有公式推导规律可循…

AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

AtCoder Regular Contest 061 E - Snuke’s Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流&#xff0c;所以一读这题后&#xff0c;我就想到了最小费用流。 首先的问题就是建边问题。 不同线路到达同一个点从而引发后面的费用是相互独立的&#xff0c;不能由…

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

HDU5519:Kykneion asma(容斥)

计数的核心是双射。 解析 这也叫数位dp呗… 首先&#xff0c;这个题目的形式很容易令人想到硬币购物&#xff0c;考虑用容斥解决&#xff0c;暴力枚举强制超额的数的集合然后分别计算贡献。 然而&#xff0c;暴力dp计算贡献的复杂度是 O(n2)O(n^2)O(n2) 的。 考虑换一种统计…

Dancing Stars on Me HDU - 5533

Dancing Stars on Me HDU - 5533 题意&#xff1a; LYD又来了&#xff0c;这次他碰到了一个小问题&#xff0c;给定n个点&#xff0c;点的坐标为均为整数&#xff0c;问这些点能否组成正多边形&#xff1f; 题解&#xff1a; 如果是正多边形&#xff0c;那中心的坐标就是所…

[HDU 3625] Examining the Rooms(第一类斯特林数)

Examining the Roomsproblemsolutioncodeproblem hdu 3625 solution 之前考试有一道题&#xff1a;最多砸开 kkk 扇门&#xff0c;采取最有操作&#xff0c;求把 nnn 个门都打开的方案数。 本题稍稍多了一个不能砸开第一扇门的限制&#xff0c;以及求的是概率。 概率好说&…

P5801 [SEERC2019]Game on a Tree(博弈论)

解析 一直在路径可逆上做功夫&#xff0c;跑偏了。 题目可以转化为一个模型&#xff1a;给出一张无向图&#xff0c;每次可以移动到未移动过的点上&#xff0c;不能移动者判负。 这个的做法就是判断是否完美匹配&#xff0c;完美匹配则后手必胜&#xff0c;否则先手必胜。 …

House Building HDU - 5538

House Building HDU - 5538 题意&#xff1a; 有n * m的地方&#xff0c;每个地方都有不同高度的1 * 1的正方形块&#xff0c;相邻块紧密排列&#xff0c;问这些块的表面积是多少&#xff1f; 题解&#xff1a; 对于位置为(i,j)的一个高度为x的块&#xff0c;他的测表面积为…

.NET 中创建支持集合初始化器的类型

对象初始化器和集合初始化器只是语法糖&#xff0c;但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开&#xff0c;可读性会好一些。本文将编写一个类型&#xff0c;可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器&#xf…

【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

P3426 [POI2005]SZA-Template(kmp、dp)

解析 做出来了就是胜利&#xff01; 个人感觉虽然我这个nxt树的码量会大一点&#xff0c;但是思路其实比较自然。&#xff08;看题解区也有&#xff09; 也是一个相当可取的做法。 现在来讲讲巧妙的dp做法。 考虑直接嗯设&#xff1a;fif_ifi​ 表示覆盖 [1,i][1,i ][1,i] 的…

为什么我的会话状态在ASP.NET Core中不工作了?

原文&#xff1a;Why isnt my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies作者&#xff1a;Andrew Lock译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10526380.html译者&#xff1a;Lamond Lu在本篇博客中&#xff0c;我将…

Jury Compromise POJ - 1015

Jury Compromise POJ - 1015 题意&#xff1a; 在遥远的国家佛罗布尼亚&#xff0c;嫌犯是否有罪&#xff0c;须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人&#xff0c;然后再从这n个人中选m人组成陪审团。选m人的办法是&#xff1a; 控…

叁仟柒佰万(mex+线段树+dp+前缀和优化+双指针+桶)

叁仟柒佰万problemsolutioncode(50’)code(90’)code(100’)problem 多组数据。 给定一个序列 aaa&#xff0c;你可以将它划分成任意多段&#xff0c;满足每一个段的 mex 相同。 求方案数&#xff0c;对 109710^971097 取模。 T≤10,n≤3e5T\le 10,n\le 3e5T≤10,n≤3e5。 …

模板:吉司机线段树

所谓吉司机线段树&#xff0c;就是吉司机种的线段树 &#xff08;逃&#xff09; 解析 之前也看过一些相关内容的博客&#xff0c;但是因标记乱七八糟&#xff0c;感觉过于高深而放弃了… 直到看到洛谷这篇博客&#xff0c;完全颠覆了我的认知。&#xff08;怎么感觉语气像营…

现身说法:实际业务出发分析百亿数据量下的多表查询优化

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化&#xff0c;俗话说的好&#xff0c;一切脱离业务的架构都是耍流氓&#xff0c;接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路。由于本文内容整理自…

Help Jimmy POJ - 1661

Help Jimmy POJ - 1661 题意&#xff1a; 场景中包括多个长度和高度各不相同的平台。地面是最低的平台&#xff0c;高度为零&#xff0c;长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落&#xff0c;它的下落速度始终为1米/秒。当Jimmy落到某个平台上时&#xff0c…

[HDU 6643] Ridiculous Netizens(点分治+根号分治+dp)

HDU 6643 Ridiculous Netizens problem hdu6643 题目大意&#xff1a;给定一棵无根树&#xff0c;以及每个点的点权 wiw_iwi​。 定义一个连通块的价值为连通块内点的点权之积。 求有多少个连通块价值 ≤m\le m≤m。 n≤2e3,m≤1e6n\le 2e3,m\le 1e6n≤2e3,m≤1e6。 solu…