BZOJ3996 TJOI2015线性代数
先把矩阵式子化简
原式=∑i=1n∑j=1nA[i]∗B[i][j]∗A[j]−∑i=1nA[i]∗C[i]
因此我们发现问题转化为选取一个点所获收益是B[i][j],代价是C[i][j]
这是一个最小割问题。
先把答案记做所有b的和。
将边按照s——>p[i][j](b[i][j]) p[i][j]——>i p[i][j]——>j i——>t(c[i])这样建图后我们删去的那个最小割意义就是花费最少的使得整个图不连通的量
如果删在左边就意味着这件物品我们不要了,如果删去右边的话就说明这件物品我们要付钱。
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
const int N=,inf=1e9;
int head[N],cnt=-,n,b[][],c[];
struct node{
int to,nex,w;
}e[];
void add(int x,int y,int w)
{
e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;e[cnt].w=w;
e[++cnt].to=x;e[cnt].nex=head[y];head[y]=cnt;e[cnt].w=;
}
int d[N],v[N],s,t;
queue<int>q;
bool bfs()
{
memset(v,,sizeof(v));
memset(d,-,sizeof(d));
d[s]=;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();v[x]=;
for(int i=head[x];i!=-;i=e[i].nex)
{
int y=e[i].to;
if(d[y]!=-||!e[i].w)continue;
d[y]=d[x]+;
if(!v[y]){
q.push(y);v[y]=;
}
}
}
return d[t]!=-;
}
int dfs(int x,int w,int yy)
{
if(!w||x==yy)return w;
int s=;
for(int i=head[x];i!=-;i=e[i].nex)
{
int y=e[i].to;
if(d[y]!=d[x]+||!e[i].w)continue;
int flow=dfs(y,min(e[i].w,w-s),yy);
if(!flow)d[y]=-;
e[i].w-=flow;e[i^].w+=flow;s+=flow;
if(s==w)return s;
}
return s;
}
int main()
{
scanf("%d",&n);int sum=,num=;
memset(head,-,sizeof(head));
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
{
scanf("%d",&b[i][j]);
}
t=n*n+n+;
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)
{
sum+=b[i][j];
add(s,++num,b[i][j]);
add(num,i+n*n,inf);
add(num,j+n*n,inf);
}
while(bfs()){
sum-=dfs(s,1e9,t);
}
printf("%d\n",sum);
return ;
}
BZOJ3996 TJOI2015线性代数的更多相关文章
- 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]线性代数 【最小割】
题目 给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 D=(AB-C)A^T最大.其中A^T为A的转置.输出D 输入格式 第一行输入一个整数N,接下来N行输入B矩阵,第i行第 ...
- 【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 ...
- 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_[TJOI2015]线性代数_最大权闭合子图
BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大. ...
随机推荐
- VMware虚拟机 安装centos7并设置静态ip 连接外网
首先下载VMware虚拟机:http://xzc.197746.com/VMware-Workstation-12.5.9.zip 然后下载centos7镜像:http://vault.centos. ...
- 查看oracle实例名
select name from v$database; show parameter service_names;
- QEMU漏洞挖掘
转载:https://www.tuicool.com/articles/MzqYbia qemu是一个开源的模拟处理器硬件设备的全虚拟化仿真器和虚拟器. KVM(kernel virtual mach ...
- python几种装饰器的用法
用函数装饰函数 这种比较常见首先定义装饰器函数 def cache(func): data = {} @wraps(func) def wrapper(*args, **kwargs): key = ...
- Django Rest Framework----ModelViewSet视图 ModelViewSet源码分析
一.视图类 #bookview是一个视图类,继承自ModelViewSet class BookView(ModelViewSet): throttle_classes = [VisitThrottl ...
- redis从入门到放弃 -> 部署方案
单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...
- docker stack 部署容器监控方案(cAdvisor、Prometheus、Grafana)
=============================================== 2018/7/8_第1次修改 ccb_warlock === ...
- 使用MongoDB命令工具导出、导入数据
Windows 10家庭中文版,MongoDB 3.6.3, 前言 在前面的测试中,已经往MongoDB的数据库中写入了一些数据.现在要重新测试程序,数据库中的旧数据需要被清理掉,可是,又想保存之前写 ...
- http://code52.org/DownmarkerWPF/
http://code52.org/DownmarkerWPF/ http://kb.cnblogs.com/page/132209/
- python网络编程-进程间数据通信(Queue,Pipe ,managers)
一:进程间数据交换方法 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法: Queue,Pipe ,managers 1)Queue,使用方法跟threading里的queue差 ...