BZOJ3996 线性代数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3996
转化题目给的条件
$$D = \sum_{i=1}^n \sum_{j=1}^n{A(i)A(j)B(i,j)} - \sum_{i=1}^n C(i)A(i)$$
网络流可解,如果要得到 $B(i,j)$ 的话必须选$i$物品和$j$物品然后,选择每一个物品都有其代价。
最大权闭合子图。
再流网络中割掉一条边就是舍弃一个$B(i,j)$
所以最小割即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue> #define N 1100010
#define INF 0x3f3f3f3f using namespace std; struct edge{
int x,to,cap;
}E[N<<]; int n,B[][],C[N],totE,g[N],S,T,h[N],tot;
queue<int> q;
bool v[N]; #define p E[i].x void ade(int x,int y,int cap){
E[++totE]=(edge){y,g[x],cap}; g[x]=totE;
E[++totE]=(edge){x,g[y],}; g[y]=totE;
} bool bfs(){
memset(v,,sizeof(v));
q.push(S); h[S]=; v[S]=;
while(!q.empty()){
int x=q.front(); q.pop();
for(int i=g[x];i;i=E[i].to)
if(E[i].cap&&!v[p]){
h[p]=h[x]+;
q.push(p); v[p]=;
}
}
return v[T];
} int dinic(int x,int flow){
if(x==T||!flow) return flow;
int f=;
for(int i=g[x];i&&flow;i=E[i].to)
if(h[p]==h[x]+&&E[i].cap){
int tmp=dinic(p,min(flow,E[i].cap));
E[i].cap-=tmp; E[i^].cap+=tmp;
f+=tmp; flow-=tmp;
}
if(!f) h[x]=-;
return f;
} int main(){
scanf("%d",&n);
for(int i=,j;i<=n;i++)
for(j=;j<=n;j++) scanf("%d",&B[i][j]);
for(int i=;i<=n;i++) scanf("%d",&C[i]);
S=n*n+n+; T=S+;
for(int i=;i<=n;i++) ade(i,T,C[i]);
int ans=;
tot=n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
ans+=B[i][j];
ade(S,++tot,B[i][j]);
ade(tot,j,INF);
ade(tot,i,INF);
}
while(bfs()) ans-=dinic(S,INF);
printf("%d\n",ans);
return ;
}
看来真的需要补线性代数呀。
BZOJ3996 线性代数的更多相关文章
- [TJOI2014] [Bzoj3996] 线性代数 [网络流,最小割]
由原式,可以推出D=Σ(i=1,n,Σ(j=1,n,A[i]*A[j]*B[i][j]))-Σ(i=1,n,A[i]*C[i]) $D=\sum\limits_{i=1}^{n}\sum\limits ...
- 【BZOJ3996】[TJOI2015]线性代数(最小割)
[BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...
- 【BZOJ3996】[TJOI2015]线性代数 最大权闭合图
[BZOJ3996][TJOI2015]线性代数 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的 ...
- 【BZOJ-3996】线性代数 最小割-最大流
3996: [TJOI2015]线性代数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1054 Solved: 684[Submit][Statu ...
- BZOJ3996 [TJOI2015]线性代数
就是求$D = A \times B \times A^T - C \times A^T$ 展开也就是$$D = \sum_{i, j} A_i * A_j * B_{i, j} - \sum_{i} ...
- 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矩阵, ...
- BZOJ3996:[TJOI2015]线性代数(最大权闭合子图)
Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接 ...
- BZOJ3996 TJOI2015线性代数
先把矩阵式子化简 原式=∑i=1n∑j=1nA[i]∗B[i][j]∗A[j]−∑i=1nA[i]∗C[i] 因此我们发现问题转化为选取一个点所获收益是B[i][j],代价是C[i][j] 这是一个最 ...
- BZOJ3996 [TJOI2015]线性代数 【最小割】
题目 给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 D=(AB-C)A^T最大.其中A^T为A的转置.输出D 输入格式 第一行输入一个整数N,接下来N行输入B矩阵,第i行第 ...
随机推荐
- IO重定向
http://tldp.org/LDP/abs/html/io-redirection.html http://mp.weixin.qq.com/s/JMHDutEG4R0hEaXrYPmCGg 每个 ...
- UICollectionView 讲解
什么是UICollectionView UICollectionView是一种新的数据展示方式,简单来说可以把他理解成多列的UITableView(请一定注意这是 UICollectionView的最 ...
- Setup and Teardown Thread Group in Jmeter
setup和teardown有点类似于每个测试用例开始和结束时要做的动作 A Thread Group is the starting point of any Jmeter Test Plan. A ...
- 文件重定向,getline()获取一样,屏幕输出流,格式控制符dec,oct,hex,精度控制setprecision(int num),设置填充,cout.width和file(字符),进制输入
1.在window下的命令重定向输出到文件里 2.将内容输入到某个文件里的方式:命令<1.txt (使用1.txt中的命令) 3.读取文件里的名,然后将命令读取最后输出到文件里.命令< ...
- BUPT复试专题—网络的核(2014)
题目描述 给定一个无向网络G,共有N个节点(1到N),M条边,求网络的核. 网络的核:到网络中其他节点距离之和最小的节点,且对于不连通的两点,他们之间的距离为N,若有多组解,输出编号最小的节点 输入 ...
- 使用 Unicode 编码
面向公共语言执行库的应用程序使用编码将字符表示形式从本机字符方案(Unicode)映射为其它方案. 应用程序使用解码将字符从非本机方案(非 Unicode)映射为本机方案. System.Text 命 ...
- nodejs什么值得买自动签到自动评论定时任务
本项目是基于nodejs开发,实现的功能是,什么值得买自动签到,自动评论功能,自动发邮件,支持多人多账号运行 目的是为了,解放双手,轻松获取什么值得买的经验和积分,得到更高的等级,从而突破很会员等级限 ...
- 6.游戏特别离不开脚本(3)-JS脚本操作java(3)(直接操作JS文件或者调用函数)
java直接运行JS脚本文件的语句,游戏开发时,策划的配置文件什么的就可以分开管理了,游戏逻辑也是一样,比如:一个功能一个脚本或者一个系统一个脚本. import java.io.FileNotFou ...
- 使用cwRsync在Windows的目录之间增量同步文件
http://www.qiansw.com/using-cwrsync-in-the-windows-directory-between-the-incremental-synchronization ...
- spring中PropertyPlaceholderHelper替换占位符的值
1.Properties中的值替换¥{}或者#{}占位符 String text = "foo=${foo},bar=${bar}"; Properties props = new ...