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最大. ...
随机推荐
- 使用qt写的进制转换器
没有使用什么数据结构,直接使用qt自带的进制转换函数, 实时出结果,代码在后面的链接中,由于初学qt,好多不会,代码构造就有点乱 截图如下
- RESTful Web 服务:教程
RESTful Web 服务:教程 随着 REST 成为大多数 Web 和 Mobile 应用的默认选择,势必要对它的基本原理有所了解. 在它提出十多年后的今天,REST 已经成为最重要的 Web ...
- oracle11g创建修改删除表
oracle11g创建修改删除表 我的数据库名字: ORCL 密码:123456 1.模式 2.创建表 3.表约束 4.修改表 5.删除表 1.模式 set oracle_sid=OR ...
- Session和Cookie,Django的自动登录机制
什么是Cookie? Cookie是浏览器的本地存储机制,存储服务器返回的各种信息,下次发起请求时再发送给服务端,比如访问baidu 什么是Session? 刚才说道,Cookie存储服务端返回的信息 ...
- android studio实现Intent通信-------牛刀小试
概述: 本博文实现一种小程序,两个Activity单向通信,主从关系,MainActivty 页面布局一个EditText+Button,实现逻辑是单击按钮将信息发送给另外一个DisplayMessa ...
- CRM (知识点)
插件 Django内置Admin Django Admin流程 ModelForm 自定义分页 curd 插件 权限 业务
- delphi TComponent类 2
来自:http://blog.csdn.net/lailai186/article/details/7442385 ------------------------------------------ ...
- Java--Jackson转换Date,Timestamp 到格式化字符串
package com.diandaxia.test; import java.sql.Timestamp; import java.util.Date; /** * Created by del-b ...
- (六)MyBatis杂项
第一节:处理CLOB.BLOB类型数据 第二节:传入多个输入参数 第三节:MyBatis分页 1,逻辑分页 2,物理分页 MyBatis默认情况下,MyBatis启用一级缓存,即同一个SqlSessi ...
- [C++]返回最值元素
1 priority_queue C++中优先队列是一种特殊的队列,能够返回队列中优先级最大或者最小的元素,其内部是由堆实现的,个人认为这种方式使用更加直观. 1.1 返回vector中的最值元素 # ...