BZOJ 3996 线性代数 最小割
题意:
给出一个N*N的矩阵B和一个1*N的矩阵C。求出一个1*N的01矩阵A.使得
分析:
这道题比较绕,我们需要看清题目中那个式子的本质。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数组的价值和,减去最小割就是我们最终获得的最大贡献。
代码:
- #include<bits/stdc++.h>
- #define ms(a,x) memset(a,x,sizeof(a))
- using namespace std;int tot=;
- const int N=,M=,inf=0x3f3f3f3f;
- int S,T,n,m,k,h[N],c=,q[N],d[N],b[M][M],C[M];
- struct node{int y,z,nxt;}e[N*];
- void add(int x,int y,int z){
- e[++c]=(node){y,z,h[x]};h[x]=c;
- e[++c]=(node){x,,h[y]};h[y]=c;
- } bool bfs(){
- int f=,t=;ms(d,-);
- q[++t]=S;d[S]=;
- while(f<=t){
- int x=q[f++];
- for(int i=h[x],y;~i;i=e[i].nxt)
- if(d[y=e[i].y]==-&&e[i].z)
- d[y]=d[x]+,q[++t]=y;
- } return (d[T]!=-);
- } int dfs(int x,int f){
- if(x==T) return f;int w,tmp=;
- for(int i=h[x],y;~i;i=e[i].nxt)
- if(d[y=e[i].y]==d[x]+&&e[i].z){
- w=dfs(y,min(e[i].z,f-tmp));
- if(!w) d[y]=-;e[i].z-=w;
- e[i^].z+=w;tmp+=w;
- if(tmp==f) return f;
- } return tmp;
- } void dinic(){
- while(bfs()) tot+=dfs(S,inf);
- } int main(){
- scanf("%d",&n);S=,T=n*n+n+;
- int sm=,nm=;ms(h,-);
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- scanf("%d",&b[i][j]);
- for(int i=;i<=n;i++)
- scanf("%d",&C[i]),add(i+n*n,T,C[i]);
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- sm+=b[i][j],add(S,++nm,b[i][j]),
- add(nm,i+n*n,inf),add(nm,j+n*n,inf);
- dinic();sm-=tot;
- printf("%d\n",sm);
- return ;
- }
最小割
BZOJ 3996 线性代数 最小割的更多相关文章
- bzoj 3996: [TJOI2015]线性代数 [最小割]
3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...
- 【BZOJ-3996】线性代数 最小割-最大流
3996: [TJOI2015]线性代数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1054 Solved: 684[Submit][Statu ...
- spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】
因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...
- bzoj 2229 [Zjoi2011]最小割(分治+最小割)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...
- [置顶] [BZOJ]2127: happiness 最小割
happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...
- BZOJ 2561: 最小生成树(最小割)
U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...
- bzoj 2229: [Zjoi2011]最小割
Description 小白在图论课上学到了一个新的概念--最小割,下课后小白在笔记本上写下了如下这段话: "对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同 ...
- [TJOI2015]线性代数(最小割)
题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 题解 观察上面那个式子发现,当一个bij有贡献时当 ...
- 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矩阵, ...
随机推荐
- js函数定义 参数只要写名称就可以了
js函数定义 参数只要写名称就可以了 以下为标准: function add(type) { } 不要写成下面这个样子 function add(var type) { } 哎 妹的 老何ja ...
- WinPcap笔记2之获取已经安装设备的高级信息
1 主要数据结构定义 struct pcap_if//网络接口列表的一个节点 一个网络接口就是一个结点 方便链表 { struct pcap_if *next;//网络接口节点 ...
- Pascal之while
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : Insert code ...
- Mysql数据库的触发器、存储引擎和存储过程
数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表 ...
- 初学者的疑惑,到底什么是javaBean?
JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中.特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性.名称中的"Bea ...
- VirtualBox搭建1主2从虚拟机
环境要求 最近在使用VirtualBox搭建一个实验环境,由于公司规定了所有的机器都不能使用固定IP,都必须由DHCP自动获取. 为了不影响公司整理的网络环境,只能把实验用的网络环境限制在使用内部IP ...
- ntp多台主机时间同步
通俗的讲,多台主机ntp时间同步,就是自定义集群中一台机器(我们这里叫它server)与网络时间同步,然后其它主机与server主机时间同步 另外,ntp时间同步机制不是我们想象的那样直接同步,而是“ ...
- Workflow 规则大全 最新版
对于怎么操作Workflow我就不重复说明了 大家可以搜索我的另一条微博.Workflow,作为一款提高效率的软件,我觉得很有必要进行推广,当然我比较需要这里面的很多规则,先为己再为公.首先我只是出 ...
- Poj 3264 Balanced Lineup RMQ模板
题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...
- C# 基础知识和VS2010的小技巧总汇(2)[转]
1.使用关键字readonly ,表示这个字段只能在执行构造函数的过程中赋值,或者由初始化语句赋值 2..net4.0新增一个 Tuple 类,代表一个有序的N元组.可以调用Tuple.Create ...