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

Solution

没有发现选择一个$a_i$就将花费$c_i$,选择$a_i$和$a_j$将收益$b_{i,j}$,然后就成了最大权闭合子图了。

Code

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<queue>
  5. #define N (1009)
  6. using namespace std;
  7.  
  8. struct Edge{int to,next,flow;}edge[*N*N];
  9. int n,b[N][N],c[N],Depth[*N*N],INF,s,e=1e6,sum;
  10. int head[*N*N],num_edge;
  11. queue<int>q;
  12.  
  13. void add(int u,int v,int l)
  14. {
  15. edge[++num_edge].to=v;
  16. edge[num_edge].next=head[u];
  17. edge[num_edge].flow=l;
  18. head[u]=num_edge;
  19. }
  20.  
  21. int DFS(int x,int low)
  22. {
  23. if (x==e || !low) return low;
  24. int f=;
  25. for (int i=head[x]; i; i=edge[i].next)
  26. if (Depth[edge[i].to]==Depth[x]+)
  27. {
  28. int Min=DFS(edge[i].to,min(low,edge[i].flow));
  29. edge[i].flow-=Min;
  30. edge[((i-)^)+].flow+=Min;
  31. f+=Min; low-=Min;
  32. if (!low) break;
  33. }
  34. if (!f) Depth[x]=-;
  35. return f;
  36. }
  37.  
  38. bool BFS(int s,int e)
  39. {
  40. memset(Depth,,sizeof(Depth));
  41. Depth[s]=; q.push(s);
  42. while (!q.empty())
  43. {
  44. int x=q.front(); q.pop();
  45. for (int i=head[x]; i; i=edge[i].next)
  46. if (!Depth[edge[i].to] && edge[i].flow)
  47. {
  48. Depth[edge[i].to]=Depth[x]+;
  49. q.push(edge[i].to);
  50. }
  51. }
  52. return Depth[e];
  53. }
  54.  
  55. int Dinic(int s,int e)
  56. {
  57. int ans=;
  58. while (BFS(s,e))
  59. ans+=DFS(s,INF);
  60. return ans;
  61. }
  62.  
  63. int main()
  64. {
  65. memset(&INF,0x7f,sizeof(INF));
  66. scanf("%d",&n);
  67. for (int i=; i<=n; ++i)
  68. for (int j=; j<=n; ++j)
  69. scanf("%d",&b[i][j]), sum+=b[i][j];
  70. for (int i=; i<=n; ++i)
  71. scanf("%d",&c[i]);
  72. for (int i=; i<=n; ++i)
  73. for (int j=; j<=n; ++j)
  74. {
  75. add(s,(i-)*n+j,b[i][j]);
  76. add((i-)*n+j,s,);
  77. }
  78. for (int i=; i<=n; ++i)
  79. for (int j=; j<=n; ++j)
  80. {
  81. add((i-)*n+j,n*n+i,INF);
  82. add(n*n+i,(i-)*n+j,);
  83. add((i-)*n+j,n*n+j,INF);
  84. add(n*n+j,(i-)*n+j,);
  85. }
  86. for (int i=; i<=n; ++i)
  87. {
  88. add(n*n+i,e,c[i]);
  89. add(e,n*n+i,);
  90. }
  91. printf("%d\n",sum-Dinic(s,e));
  92. }

BZOJ3996:[TJOI2015]线性代数(最大权闭合子图)的更多相关文章

  1. [TJOI2015] 线性代数 - 最大权闭合子图

    展开 \(D=(AB-C)A^T\\ =\sum_{i=1}^n(\sum_{j=1}^na_jb_{j,i}-c_i)a_i\\ =\sum_{i=1}^n\sum_{j=1}^na_ia_jb_{ ...

  2. bzoj 3996 线性代数 —— 最大权闭合子图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3996 把题中的式子拆开看看,发现就是如下关系: 如果 a[i] == 1 && ...

  3. 【BZOJ3996】[TJOI2015]线性代数 最大权闭合图

    [BZOJ3996][TJOI2015]线性代数 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的 ...

  4. BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图

    BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大. ...

  5. BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...

  6. HDU 3879 Base Station(最大权闭合子图)

    经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...

  7. [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...

  8. HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...

  9. HDU5855 Less Time, More profit(最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5855 Description The city planners plan to build ...

随机推荐

  1. echart 数据视图 样式重写

    来源http://blog.csdn.net/u010705091/article/details/75212724 echarts折线图的数据视图样式重写 在echarts.js中,点击折线图的数据 ...

  2. Java GC机制详解

    垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制. 导读: 1.什么是GC 2.GC常用算法 3.垃圾收集器 4.finalize()方法详解 5. ...

  3. php静态变量与方法与phar的使用

    本节用类与静态变量改造之前的例子:php根据命令行参数生成配置文件 ghostinit.php: <?php class ghostinit{ static $version = 'ghost ...

  4. django-sql注入攻击

    一.原理 什么是sql注入 所谓SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串(注入本质上就是把输入的字符串变成可执行的程序语句),最终达到欺骗服务器执行恶意的SQ ...

  5. MVC 、JDBC、SQL、DBMS、RDBMS、DDL、DML、DCL

    MVC: 全称:Model View Controller: 解释:模型(model)-视图(view)-控制器(controller) Model(模型)表示应用程序核心(比如数据库记录列表). V ...

  6. 从0x7fffffff+1开始的数学期望

    -2147483648 Impel Down 蒙奇·D·路飞来到海底监狱Impel Down营救他的哥哥波特卡斯·D·艾斯 n+1层的海底监狱有n个电梯,每个电梯连接着上下两层 不幸的是,这些电梯是& ...

  7. 关于子元素的margin-top溢出和元素浮动对父元素高度影响解决方案

    以下是个人学习笔记,仅供学习参考. 1.关于子元素的margin-top作用在无margin-top-border的父元素上导致子元素的margin-top溢出问题. 在给没有margin-top-b ...

  8. vs中nuget命令的用法

    一.安装 1.安装指定版本类库install-package <程序包名> -version <版本号>        ( 注意:-version <版本号> 可以 ...

  9. JSP内置对象——session对象

    举个购物流程的例子: 这整个购物过程,它是属于一次回话.那么这个session是保存在服务器内存当中,并且它保存着不同用户对应的session,一个用户对应一个session.看下面这幅图: 从图中可 ...

  10. android:首页点击返回键,两秒内再次点击退出系统

    //记录用户首次点击返回键的时间 private long firstTime = 0; /** * 通过监听keyUp 实现双击返回键退出程序 * @param keyCode * @param e ...