把转置矩阵看成逆矩阵吓傻了233

首先按照矩乘推一下式子:

\[D=\sum_{i=1}^n a[i]*(\sum_{j=1}^n a[j]*b[j][i])-c[i]
\]

\[D=(\sum_{i=1}^n \sum_{j=1}^n a[i]*a[j]*b[j][i])-(\sum_{i=1}^n a[i]*c[i])
\]

这样,很容易看出b是贡献部分,当a[i]a[j]同时为1的时候贡献b[i][j]+b[j][i],否则不贡献;c是花费部分,a[i]选1就花费c[i]

有正负收益,所以考虑最小割,首先默认b全选,ans=Σb,然后建图,设最后割出来和s相连为选0,和t相连为选1:

连接(s,i,c[i]),表示如果割掉这条边i选0则花费c[i];

连接(i,id(i,j),inf),(j,id(i,j),inf),注意这里!id(i,j)==id(j,i),表示一个无序二元组,这样连边表示不可割以便把操作引到边上

连接(id(i,j),t,b[i][j]+b[j][i]),表示ij中有一个选0(就是不断c的那条边)就需要割这一条

跑最小割即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=505;
  7. int n,b[N][N],id[N][N],tot,s,t,h[N*N],cnt=1,le[N*N],ans;
  8. struct qwe
  9. {
  10. int ne,to,va;
  11. }e[N*N*10];
  12. int read()
  13. {
  14. int r=0,f=1;
  15. char p=getchar();
  16. while(p>'9'||p<'0')
  17. {
  18. if(p=='-')
  19. f=-1;
  20. p=getchar();
  21. }
  22. while(p>='0'&&p<='9')
  23. {
  24. r=r*10+p-48;
  25. p=getchar();
  26. }
  27. return r*f;
  28. }
  29. void add(int u,int v,int w)
  30. {
  31. cnt++;
  32. e[cnt].ne=h[u];
  33. e[cnt].to=v;
  34. e[cnt].va=w;
  35. h[u]=cnt;
  36. }
  37. void ins(int u,int v,int w)
  38. {
  39. add(u,v,w);
  40. add(v,u,0);
  41. }
  42. bool bfs()
  43. {
  44. memset(le,0,sizeof(le));
  45. queue<int>q;
  46. le[s]=1;
  47. q.push(s);
  48. while(!q.empty())
  49. {
  50. int u=q.front();
  51. q.pop();
  52. for(int i=h[u];i;i=e[i].ne)
  53. if(e[i].va>0&&!le[e[i].to])
  54. {
  55. le[e[i].to]=le[u]+1;
  56. q.push(e[i].to);
  57. }
  58. }
  59. return le[t];
  60. }
  61. int dfs(int u,int f)
  62. {
  63. if(u==t||!f)
  64. return f;
  65. int us=0;
  66. for(int i=h[u];i&&us<f;i=e[i].ne)
  67. if(e[i].va>0&&le[e[i].to]==le[u]+1)
  68. {
  69. int t=dfs(e[i].to,min(e[i].va,f-us));
  70. e[i].va-=t;
  71. e[i^1].va+=t;
  72. us+=t;
  73. }
  74. if(!us)
  75. le[u]=0;
  76. return us;
  77. }
  78. int dinic()
  79. {
  80. int r=0;
  81. while(bfs())
  82. r+=dfs(s,1e9);
  83. return r;
  84. }
  85. int main()
  86. {
  87. n=tot=read();
  88. for(int i=1;i<=n;i++)
  89. for(int j=1;j<=n;j++)
  90. {
  91. b[i][j]=read();
  92. if(i<=j)
  93. id[i][j]=id[j][i]=++tot;
  94. ans+=b[i][j];
  95. }
  96. s=0,t=tot+1;
  97. for(int i=1;i<=n;i++)
  98. ins(s,i,read());
  99. for(int i=1;i<=n;i++)
  100. for(int j=1;j<=n;j++)
  101. ins(i,id[i][j],1e9);
  102. for(int i=1;i<=n;i++)
  103. for(int j=i;j<=n;j++)
  104. ins(id[i][j],t,b[i][j]+b[j][i]);
  105. printf("%d\n",ans-dinic());
  106. return 0;
  107. }

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]线性代数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3996 题解: 好题啊.(不太熟悉矩阵相关,所以按某些博主的模型转换来理解的)首先,那个式子可 ...

  4. 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,接 ...

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

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

  6. 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矩阵, ...

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

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

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

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

  9. BZOJ 3996 线性代数 最小割

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

随机推荐

  1. pygame 安装教程

    步骤: 1.去官网下载PyGame 注意:要下载对应版本的包 官网地址:http://www.pygame.org/download.shtml 其中,如果python为以下版本: python 3. ...

  2. EasyDarwin开源流媒体项目

    本文转自EasyDarwin CSDN官方博客:http://blog.csdn.net/easydarwin EasyDarwin是由国内开源流媒体团队维护和迭代的一整套开源流媒体视频平台框架,从2 ...

  3. appium(5)-Appium capabilities

    Appium Capabilities Appium server capabilities Capability Description Values automationName Which au ...

  4. CodeSign相关

    要让苹果App在真机上跑,需要私钥(PrivateKey),证书(Certificate)和描述文件(Provisioning Profile). (一) 安全基础: 1.非对称加密: 2.Hash码 ...

  5. php memcache知识点总结

    $memcache = new Memcache; $memcache->connect('localhost',11211) or die('Could not connect'); //me ...

  6. cocoapod使用

    什么是cocoapod CocoaPods是用于方便使用第三方开源库的管理工具,减少我们对第三方库的各种配置. 安装教程参考: CocoaPods的介绍.安装.使用和原理 Cocoapod安装使用 第 ...

  7. codeforces C. Inna and Huge Candy Matrix 解题报告

    题目链接:http://codeforces.com/problemset/problem/400/C 题目意思:给出一个n行m列的矩阵,问经过 x 次clockwise,y 次 horizontal ...

  8. netty ssl

    netty提供的例子中有secury的实现,不过是一个伪证书.修改了一下其中的SecureChatSslContextFactory类,使用证书的方式实现ssl.修改后代码如下: public fin ...

  9. 在Angular.js中的H5页面调用Web api时跨域问题处理

    /// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...

  10. distutils 打包setup.py

    from distutils.core import setup setup(name='hello', version='1.0', description='test example', auth ...