3996: [TJOI2015]线性代数

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1368  Solved: 832

Description

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

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

Input

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

Output

输出最大的D

Sample Input

3
1 2 1
3 1 0
1 2 3
2 3 7

Sample Output

2

HINT

1<=N<=500

Source

【分析】

  化一下式子得到$D=\sum_{i=1}^{n}\sum_{j=1}^{n}A_i * A_j * B_{ij} - \sum_{i=1}^{n} A_i * C_i$

  网络流建图。

  S→Dot(i,j),流量为bij

  Dot(i,j)→i 以及 Dot(i,j)→j,流量为 ∞

  连边 i→T,流量为ci

  设最小割为$x$,那么答案就是

                  
                $\sum_{i=1}^{n}\sum_{j=1}^{n} B_{ij} - x$

  经典模型??不能弄成类似二分图那样的模型就只能这样了,虽然点很多,但是图比较简单应该还是很快吧?

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8. #define Maxn 510
  9. #define INF 0xfffffff
  10.  
  11. int mymin(int x,int y) {return x<y?x:y;}
  12.  
  13. struct node
  14. {
  15. int x,y,f,next,o;
  16. }t[Maxn*Maxn*];
  17. int first[Maxn*Maxn*],len;
  18.  
  19. void ins(int x,int y,int f)
  20. {
  21. t[++len].x=x;t[len].y=y;t[len].f=f;
  22. t[len].next=first[x];first[x]=len;t[len].o=len+;
  23. t[++len].x=y;t[len].y=x;t[len].f=;
  24. t[len].next=first[y];first[y]=len;t[len].o=len-;
  25. }
  26.  
  27. int ans;
  28. int dis[Maxn*Maxn*],st,ed;
  29. queue<int > q;
  30. bool bfs()
  31. {
  32. memset(dis,-,sizeof(dis));
  33. while(!q.empty()) q.pop();
  34. dis[st]=;q.push(st);
  35. while(!q.empty())
  36. {
  37. int x=q.front();
  38. for(int i=first[x];i;i=t[i].next) if(t[i].f>)
  39. {
  40. int y=t[i].y;
  41. if(dis[y]==-)
  42. {
  43. dis[y]=dis[x]+;
  44. q.push(y);
  45. }
  46. }
  47. q.pop();
  48. }
  49. if(dis[ed]==-) return ;
  50. return ;
  51. }
  52.  
  53. int ffind(int x,int flow)
  54. {
  55. if(x==ed) return flow;
  56. int now=;
  57. for(int i=first[x];i;i=t[i].next) if(t[i].f>)
  58. {
  59. int y=t[i].y;
  60. if(dis[y]==dis[x]+)
  61. {
  62. int a=ffind(y,mymin(flow-now,t[i].f));
  63. t[i].f-=a;
  64. t[t[i].o].f+=a;
  65. now+=a;
  66. }
  67. if(now==flow) break;
  68. }
  69. if(now==) dis[x]=;
  70. return now;
  71. }
  72.  
  73. void max_flow()
  74. {
  75. while(bfs())
  76. {
  77. ans-=ffind(st,INF);
  78. }
  79. }
  80.  
  81. int main()
  82. {
  83. freopen("a.in","r",stdin);
  84. freopen("a.out","w",stdout);
  85. int n;
  86. scanf("%d",&n);
  87. st=n*n+n+,ed=st+;
  88. len=;
  89. memset(first,,sizeof(first));
  90. ans=;
  91. for(int i=;i<=n;i++)
  92. for(int j=;j<=n;j++)
  93. {
  94. int x;
  95. scanf("%d",&x);
  96. ins(st,n*(i-)+j,x);
  97. ans+=x;
  98. ins(n*(i-)+j,n*n+i,INF);
  99. ins(n*(i-)+j,n*n+j,INF);
  100. }
  101. for(int i=;i<=n;i++)
  102. {
  103. int x;
  104. scanf("%d",&x);
  105. ins(n*n+i,ed,x);
  106. }
  107. max_flow();
  108. printf("%d\n",ans);
  109. return ;
  110. }

2017-03-24 08:40:32

【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)的更多相关文章

  1. bzoj 3996: [TJOI2015]线性代数 [最小割]

    3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...

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

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

  3. BZOJ3996[TJOI2015]线性代数——最小割

    题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 输入 第一行输入一个整数N,接下来N行输入B矩阵, ...

  4. bzoj 3996 [TJOI2015]线性代数——最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3996 b[ i ][ j ] 要计入贡献,当且仅当 a[ i ] = 1 , a[ j ] ...

  5. BZOJ 3996 线性代数 最小割

    题意: 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 分析: 这道题比较绕,我们需要看清题目中那个式子的本 ...

  6. 【BZOJ-3996】线性代数 最小割-最大流

    3996: [TJOI2015]线性代数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1054  Solved: 684[Submit][Statu ...

  7. [BZOJ 3144] [Hnoi2013] 切糕 【最小割】

    题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...

  8. [BZOJ 3894] 文理分科 【最小割】

    题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...

  9. BZOJ 2039 人员雇佣 二元关系 最小割

    题面太长了,请各位自行品尝—>人员雇佣 分析: 借用题解的描述: a.选择每个人有一个代价Ai b.如果有两个人同时选择就可以获得收益Ei,j c.如果一个人选择另一个不选会产生代价Ei,j 这 ...

  10. BZOJ 2007 海拔(平面图最小割-最短路)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...

随机推荐

  1. Web 开发者易犯的5大严重错误

    无论你是编程高手,还是技术爱好者,在进行Web开发过程中,总避免不了犯各种各样的错误. 犯了错误,可以改正.但如果犯了某些错误,则会带来重大损失.遗憾.令人惊讶的是,这些错误往往是最普通,最容易避免. ...

  2. 零基础讲解JavaScript函数

    一 JavaScript函数1 什么是函数  函数是一组代码(指令)的集合,通常用来完成某个单一的功能.(书的目录和章节,电视剧剧集的名称等)2 为什么要使用函数  2.1 把复杂程序划分成不同的功能 ...

  3. 组合数+逆元 A - Chat Group Gym - 101775A

    题目链接:https://cn.vjudge.net/contest/274151#problem/A 具体思路:我们可以先把所有的情况算出来,为2^n.然后不合法的情况减去就可以了.注意除法的时候要 ...

  4. Python ctypes中cast/py_object用法

    class ctypes.py_object Represents the C PyObject * datatype. Calling this without an argument create ...

  5. javashop每次重新部署都要从新安装的问题

    javashop每次重新部署都要从新安装的问题 发现一个问题就是用MyEclipse是部署不上的,用eclipse才行. 这个问题的关键在于javashop有好多文件都是动态生成的,好多配置文件也是在 ...

  6. 购物车中的input输入框只能输入数字和输入为0的时候默认为1

    <input type="text" value="1" onkeyup="value=(parseInt((value=value.repla ...

  7. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  8. C++显式类型转换

    C++显式类型转换 (注:本文例程改编自<C++ Primer>) 关于类型转换,C++保留了C语言中的类型转换方式,并提供了4中新的类型转换方式.<Effective C++> ...

  9. Android仿新浪新闻SlidingMenu界面的实现 .

    先看看原图: 如图所示,这种侧滑效果以另一种方式替代了原先tab导航的那种用户体验方式 给人耳目一新的感觉,现已被广大知名应用所效仿,如新浪新闻,网易新闻,人人网等 那么这种效果该如何实现呢?那就需要 ...

  10. YAML中使用Jinja模板以{{ foo }}开头需要整行加双引号

    YAML陷阱 YAML语法要求如果值以{{ foo }}开头的话我们需要将整行用双引号包起来.这是为了确认你不是想声明一个YAML字典.该知识点在 YAML 语法 页面有所讲述. 这样是不行的: - ...