题目

给出一个NN的矩阵B和一个1N的矩阵C。求出一个1*N的01矩阵A.使得

D=(AB-C)A^T最大。其中A^T为A的转置。输出D

输入格式

第一行输入一个整数N,接下来N行输入B矩阵,第i行第J个数字代表Bij.
接下来一行输入N个整数,代表矩阵C。矩阵B和矩阵C中每个数字都是不超过1000的非负整数。

输出格式

输出最大的D

输入样例

3

1 2 1

3 1 0

1 2 3

2 3 7

输出样例

2

提示

1<=N<=500

题解

我们将式子化简,就是:
\(\sum_{i = 1}^{n} \sum_{j = 1}^{n} Bij * Ai * Aj - \sum_{i}^{n} Ci * Ai\)
相当于,有n个物品,选择每个物品都有代价,任意两个物品同时选择时都有价值,求最大价值

用最小割解决
对于任意两个点i和j,建一个新点u,两点向u连边INF,u向T连边,容量为两个物品选择的权值
S向所有点连边,容量为该物品价值

我们假设一开始拥有所有价值
这样一来,要割去,每个点要么要花费其代价S->u,要么花费其与其它物品的共同代价u->T

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 300005,maxm = 5000005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int h[maxn],ne = 2,n,m;
struct EDGE{int to,nxt,f;}ed[maxm];
inline void build(int u,int v,int w){ed[ne] = (EDGE){v,h[u],w}; h[u] = ne++;ed[ne] = (EDGE){u,h[v],0}; h[v] = ne++;
}
int d[maxn],vis[maxn],S,T,cur[maxn];
bool bfs(){for (int i = S; i <= T; i++) vis[i] = 0,d[i] = INF;queue<int> q;q.push(S); vis[S] = true; d[S] = 0;int u;while (!q.empty()){u = q.front(); q.pop();Redge(u) if (ed[k].f && !vis[to = ed[k].to]){d[to] = d[u] + 1; vis[to] = true;q.push(to);}}return vis[T];
}
int dfs(int u,int minf){if (u == T || !minf) return minf;int f,flow = 0,to;if (cur[u] == -1) cur[u] = h[u];for (int& k = cur[u]; k; k = ed[k].nxt)if (d[to = ed[k].to] == d[u] + 1 && (f = dfs(to,min(minf,ed[k].f)))){ed[k].f -= f; ed[k ^ 1].f += f;flow += f; minf -= f;if (!minf) break;}return flow;
}
int maxflow(){int flow = 0;while (bfs()){memset(cur,-1,sizeof(cur));flow += dfs(S,INF);}return flow;
}
int main(){n = read(); S = 0; T = n + n * n + 1;int x,ans = 0,id = n;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){ans += (x = read()); id++;build(i,id,INF);build(j,id,INF);build(id,T,x);}}for (int i = 1; i <= n; i++) build(S,i,read());printf("%d\n",ans - maxflow());return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8533427.html

BZOJ3996 [TJOI2015]线性代数 【最小割】相关推荐

  1. [TJOI2015]线性代数(最小割)

    题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 题解 观察上面那个式子发现,当一个bij有贡献时当 ...

  2. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  3. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  4. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  5. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  6. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  7. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  8. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

  9. 最小割 ---- 集合冲突模型

    集合冲突模型 1.问题形式 有 n 个物品和两个集合 S,T.将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi.还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个 ...

最新文章

  1. 廉洁修身论文2000字_自主招生论文发表要求【期刊论文】自主招生论文发表要求...
  2. ArcGIS实验教程——实验三十二:ArcGIS水文分析(流向分析、计算水流长度、汇流分析、河网分析、流域分析)
  3. mac使用的正确操作与注意事项(人体工程学)
  4. 硬件磁盘阵列还是软件磁盘阵列
  5. curl: (52) Empty reply from server
  6. 比赛-6月Round1
  7. usb扩展坞同时接键盘鼠标_iPadOS 13.1连接鼠标键盘扩展坞用法说明
  8. 手游方舟怎么输入代码_方舟秘籍代码详细攻略介绍一览
  9. livezilla安装指南
  10. 企业网络:安全只能靠两招
  11. destoon标签调用技巧
  12. springcloudfeign Required request body is missing
  13. 移动端自动化任务-AutoJs Pro v9使用教程(一)
  14. Java实现可换行文字转图片
  15. mac 命令行 解压7z文件_如何在Mac上快速压缩和解压文件?Mac上解压和压缩文件的方法...
  16. java 增加内存_如何增加java虚拟机可以使用的最大内存
  17. js插件的经典写法与总结
  18. Box2D v2.1.0用户手册翻译 - 第06章 夹具(Fixtures)
  19. 这篇文章几乎回答了你对量化对冲的所有疑问
  20. 家电三巨头的集体突围

热门文章

  1. 36个创意广告海报欣赏
  2. .net 使用 Aspose.Words 进行 Word替换操作
  3. 真人3D Avatar
  4. Ubuntu 16.04设置IP、网关、DNS
  5. 如何评估深度学习模型效果?阿里工程师这么做
  6. Shell命令-文件及目录操作之mkdir、mv
  7. 医疗AI技术火热,但其商业模式的落脚点究竟在哪
  8. Shader山下(二十一)多重变体(Multiple Variants)
  9. mysql对执行结果进行html格式的输出?输出html格式?
  10. 数据中心机房夏日降温措施