题意:

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

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

分析:

  这道题比较绕,我们需要看清题目中那个式子的本质。A*B的贡献是正的,说明这是价值。C的贡献是负的,说明这是代价。

  仔细理解这句话“只有ai和aj同时为1的时候,才对答案有bij的贡献。使ai为1的代价为ci”

  我们现在是否能从题目中的式子中提炼出这个关系?如果能,请继续

  为什么说这题是最小割呢?因为,这里有新的两个字,当我们面临这两个字时,就要考虑最小割,那就是“取舍

  在这道题的意志中,我们需要选择舍弃b带来的相应价值,以此来避免付出代价,或者是为了获得价值,而选择舍弃而付出相应的代价。所以我们建图为两部分:

  左半部分,有n^2个点,(可以理解是我们抽象出的b数组)从原点向(i,j)点连容量为bij的边,右半部分有n个点,i号点向汇点连一条容量为ci的边。

  点(i,j)右边的点i和j分别连容量为inf的边。

  这样呢,我们的限制就是,要么舍弃bij这个价值,要么付出ci和cj的代价,对于每个点都是这样,最小割,就是我们最少舍弃的贡献。然后,我们求出b数组的价值和,减去最小割就是我们最终获得的最大贡献。

代码:

  1. #include<bits/stdc++.h>
  2. #define ms(a,x) memset(a,x,sizeof(a))
  3. using namespace std;int tot=;
  4. const int N=,M=,inf=0x3f3f3f3f;
  5. int S,T,n,m,k,h[N],c=,q[N],d[N],b[M][M],C[M];
  6. struct node{int y,z,nxt;}e[N*];
  7. void add(int x,int y,int z){
  8. e[++c]=(node){y,z,h[x]};h[x]=c;
  9. e[++c]=(node){x,,h[y]};h[y]=c;
  10. } bool bfs(){
  11. int f=,t=;ms(d,-);
  12. q[++t]=S;d[S]=;
  13. while(f<=t){
  14. int x=q[f++];
  15. for(int i=h[x],y;~i;i=e[i].nxt)
  16. if(d[y=e[i].y]==-&&e[i].z)
  17. d[y]=d[x]+,q[++t]=y;
  18. } return (d[T]!=-);
  19. } int dfs(int x,int f){
  20. if(x==T) return f;int w,tmp=;
  21. for(int i=h[x],y;~i;i=e[i].nxt)
  22. if(d[y=e[i].y]==d[x]+&&e[i].z){
  23. w=dfs(y,min(e[i].z,f-tmp));
  24. if(!w) d[y]=-;e[i].z-=w;
  25. e[i^].z+=w;tmp+=w;
  26. if(tmp==f) return f;
  27. } return tmp;
  28. } void dinic(){
  29. while(bfs()) tot+=dfs(S,inf);
  30. } int main(){
  31. scanf("%d",&n);S=,T=n*n+n+;
  32. int sm=,nm=;ms(h,-);
  33. for(int i=;i<=n;i++)
  34. for(int j=;j<=n;j++)
  35. scanf("%d",&b[i][j]);
  36. for(int i=;i<=n;i++)
  37. scanf("%d",&C[i]),add(i+n*n,T,C[i]);
  38. for(int i=;i<=n;i++)
  39. for(int j=;j<=n;j++)
  40. sm+=b[i][j],add(S,++nm,b[i][j]),
  41. add(nm,i+n*n,inf),add(nm,j+n*n,inf);
  42. dinic();sm-=tot;
  43. printf("%d\n",sm);
  44. return ;
  45. }

最小割

BZOJ 3996 线性代数 最小割的更多相关文章

  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】线性代数 最小割-最大流

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

  3. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

  4. bzoj 2229 [Zjoi2011]最小割(分治+最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...

  5. [置顶] [BZOJ]2127: happiness 最小割

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

  6. BZOJ 2561: 最小生成树(最小割)

    U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...

  7. bzoj 2229: [Zjoi2011]最小割

    Description 小白在图论课上学到了一个新的概念--最小割,下课后小白在笔记本上写下了如下这段话: "对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同 ...

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

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

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

随机推荐

  1. 3 Java对象的内存布局以及对象的访问定位

    先来看看Java对象在内存中的布局   一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...

  2. idea运行scala有问题

    报这个错误:java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/m ...

  3. bzoj 3894 文理分科【最小割+dinic】

    谁说这道和2127是双倍经验的来着完全不一样啊? 数组开小会TLE!数组开小会TLE!数组开小会TLE! 首先sum统计所有收益 对于当前点\( (i,j) \)考虑,设\( x=(i-1)*m+j ...

  4. 洛谷 P4015 运输问题 【最小费用最大流+最大费用最大流】

    s向仓库i连ins(s,i,a[i],0),商店向t连ins(i+m,t,b[i],0),商店和仓库之间连ins(i,j+m,inf,c[i][j]).建两次图分别跑最小费用最大流和最大费用最大流即可 ...

  5. java多线程下模拟抢票

    我们设置三个对象分别同时抢20张票,利用多线程实现. public class Web123506 implements Runnable{ private int ticteksNums=20;// ...

  6. 环境变量解释以及在Linux下的环境变量设置

    一.环境变量解释 环境变量是什么? 引用百度百科里面的解释:环境变量是操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows系统中的path环境变量,当要求 ...

  7. [TJOI2013]松鼠聚会

    Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短 ...

  8. 题解报告:hdu 1114 Piggy-Bank(完全背包恰好装满)

    Problem Description Before ACM can do anything, a budget must be prepared and the necessary financia ...

  9. 关于jquery获取单选框value属性值为on的问题

    当取单选框的value值的时候,前提是要有value这个属性,如果没有value属性那么取出来的就会为on 取value值的常见三种方式为 $("input[name='XXX']:chec ...

  10. 组合模式和php实现

    组合模式(有时候又叫做部分-整体模式): 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.它使我们树型结构的问题中,模糊了简单元素和复杂元素的概 ...