题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=3996

题解:

好题啊。
(不太熟悉矩阵相关,所以按某些博主的模型转换来理解的)
首先,那个式子可以化简为
D(某个数)=A * B * A' - C * A' ( A'为 A的倒置矩阵)
因为 A 为 01 矩阵,
把其考虑为 N个物品选或不选,
C[i]对应为i物品的花费,
而B[i,j]对应为同时选了i,j两个物品后带来的价值。
所以结合A,B,C的意义,用简单的矩阵知识去理解那个式子,
可以知道,D求得便是最大收益。
那么就转化为了 一个经典的最小割问题。(建图类似于网络流24道之太空飞行计划问题):
建立超源S,超汇T;
S -> (i,j) : B[i][j]
(i,j) -> (i) : INF
(i,j) -> (j) : INF
(i) -> T  : C[i]
然后 ANS=sum(B)-最小割

代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #define MAXN 505*505
  6. #define INF 0x3f3f3f3f
  7. using namespace std;
  8. struct Edge{
  9. int to[MAXN*8],cap[MAXN*8],nxt[MAXN*8],head[MAXN*2],ent;
  10. void Init(){
  11. ent=2; memset(head,0,sizeof(head));
  12. }
  13. void Adde(int u,int v,int w){
  14. to[ent]=v; cap[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
  15. to[ent]=u; cap[ent]=0; nxt[ent]=head[v]; head[v]=ent++;
  16. }
  17. int Next(int i,bool type){
  18. return type?head[i]:nxt[i];
  19. }
  20. }E;
  21. int cur[MAXN*2],d[MAXN*2];
  22. int N,S,T,ANS;
  23. int idx(int i,int j){
  24. return j?(i-1)*N+j:N*N+i;
  25. }
  26. bool bfs(){
  27. memset(d,0,sizeof(d));
  28. queue<int>q; d[S]=1; q.push(S);
  29. while(!q.empty()){
  30. int u=q.front(); q.pop();
  31. for(int i=E.Next(u,1);i;i=E.Next(i,0)){
  32. int v=E.to[i];
  33. if(d[v]||!E.cap[i]) continue;
  34. d[v]=d[u]+1; q.push(v);
  35. }
  36. }
  37. return d[T];
  38. }
  39. int dfs(int u,int reflow){
  40. if(u==T||!reflow) return reflow;
  41. int flowout=0,f;
  42. for(int &i=cur[u];i;i=E.Next(i,0)){
  43. int v=E.to[i];
  44. if(!E.cap[i]||d[v]!=d[u]+1) continue;
  45. f=dfs(v,min(reflow,E.cap[i]));
  46. flowout+=f; E.cap[i^1]+=f;
  47. reflow-=f; E.cap[i]-=f;
  48. if(!reflow) break;
  49. }
  50. if(!flowout) d[u]=0;
  51. return flowout;
  52. }
  53. int dinic(){//求最小割
  54. int flow=0;
  55. while(bfs()){
  56. memcpy(cur,E.head,sizeof(E.head));
  57. flow+=dfs(S,INF);
  58. }
  59. return flow;
  60. }
  61. int main()
  62. {
  63. E.Init();
  64. scanf("%d",&N); S=N*N+N+1; T=S+1;
  65. for(int i=1,x;i<=N;i++)
  66. for(int j=1;j<=N;j++){
  67. scanf("%d",&x); ANS+=x;
  68. E.Adde(S,idx(i,j),x);
  69. E.Adde(idx(i,j),idx(i,0),INF);
  70. E.Adde(idx(i,j),idx(j,0),INF);
  71. }
  72. for(int i=1,x;i<=N;i++){
  73. scanf("%d",&x);
  74. E.Adde(idx(i,0),T,x);
  75. }
  76. ANS-=dinic();
  77. printf("%d",ANS);
  78. return 0;
  79. }

●BZOJ 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. bzoj 3996 [TJOI2015]线性代数——最小割

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

  3. bzoj 3996: [TJOI2015]线性代数

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

  4. bzoj 3996: [TJOI2015]线性代数【最小割】

    把转置矩阵看成逆矩阵吓傻了233 首先按照矩乘推一下式子: \[ D=\sum_{i=1}^n a[i]*(\sum_{j=1}^n a[j]*b[j][i])-c[i] \] \[ D=(\sum_ ...

  5. 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)

    3996: [TJOI2015]线性代数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1368  Solved: 832 Description 给 ...

  6. 【BZOJ】3996: [TJOI2015]线性代数

    题意 给出一个\(N \times N\)的矩阵\(B\)和一个\(1 \times N\)的矩阵\(C\).求出一个\(1 \times N\)的01矩阵\(A\),使得\[ D = ( A * B ...

  7. 【BZOJ3996】[TJOI2015]线性代数(最小割)

    [BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...

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

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

  9. 【LG3973】[TJOI2015]线性代数

    [LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...

随机推荐

  1. Alpha冲刺Day7

    Alpha冲刺Day7 一:站立式会议 今日安排: 由林静和周静平共同完成企业风险分级展示这一模块的分级列表展示,该模块主要提供企业自查风险的条件查询功能 由黄腾飞和张梨贤共同完成企业风险分级展示的分 ...

  2. xcode进行代码覆盖率测试

    去年写的文章,搬到cnblog 本文所述的方法只对xcode5做过测试,xcode6是否可行尚未可知. 配置编译选项 首先请参考苹果官方的文档Configuring Xcode for Code Co ...

  3. 关于tomcat部署应用的三种方式

    关于tomcat部署应用虽然不是一个经常的操作,因为一旦选择了一种部署方式,我们其他的应用就会不经大脑的使用这种既定模式, 如果不使用这种部署方式,但是对于其他的部署方式不是很清楚的话,很容易抓瞎,所 ...

  4. 前端之bootstrap模态框

    简介:模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. Modal简介 Modal实现弹出表单 M ...

  5. Mongodb中 Documents文档说明

    mongodb使用BSON格式存储数据记录. 如下图: 文档结构 文档有键值对组成, 有以下结构: {    field1: value1,    field2: value2,    ...     ...

  6. ubuntu启动报/root/.profile mesg:ttyname failed错误的解决办法

    修改/root/.profile文件,如下命令 sudo gedit /root/profile 将文中的最后一行mesg n修改成tty -s && mesg n

  7. IdentityServer4实战 - 基于角色的权限控制及Claim详解

    一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家.在QQ群里有许多人都问过IdentityServ ...

  8. web api 如何通过接收文件流的方式,接收客户端及前端上传的文件

    服务端接收文件流代码: public async Task<HttpResponseMessage> ReceiveFileByStream() { var stream = HttpCo ...

  9. H5 FormData对象的作用及用法

    JS: function uploadFileAndParam() { var url = "http://localhost:42561/api/upload/UploadPost&quo ...

  10. 获取apk项目的MD5值和SHA1值

    一些可说可不说的话: * 以前有一个更简单的方法,在as的右边工具栏的 gradle 面板中可以很方便的获取到: * 上次用也是在2年前,时间长了给忘记了,不过我记得我当时写了笔记,这会笔记不在身边, ...