●BZOJ 3996 [TJOI2015]线性代数
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=3996
题解:
好题啊。
(不太熟悉矩阵相关,所以按某些博主的模型转换来理解的)
首先,那个式子可以化简为
D(某个数)=A * B * A' - C * A' ( A'为 A的倒置矩阵)
因为 A 为 01 矩阵,
把其考虑为 N个物品选或不选,
C[i]对应为i物品的花费,
而B[i,j]对应为同时选了i,j两个物品后带来的价值。
所以结合A,B,C的意义,用简单的矩阵知识去理解那个式子,
可以知道,D求得便是最大收益。
那么就转化为了 一个经典的最小割问题。(建图类似于网络流24道之太空飞行计划问题):
建立超源S,超汇T;
S -> (i,j) : B[i][j]
(i,j) -> (i) : INF
(i,j) -> (j) : INF
(i) -> T : C[i]
然后 ANS=sum(B)-最小割
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 505*505
#define INF 0x3f3f3f3f
using namespace std;
struct Edge{
int to[MAXN*8],cap[MAXN*8],nxt[MAXN*8],head[MAXN*2],ent;
void Init(){
ent=2; memset(head,0,sizeof(head));
}
void Adde(int u,int v,int w){
to[ent]=v; cap[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
to[ent]=u; cap[ent]=0; nxt[ent]=head[v]; head[v]=ent++;
}
int Next(int i,bool type){
return type?head[i]:nxt[i];
}
}E;
int cur[MAXN*2],d[MAXN*2];
int N,S,T,ANS;
int idx(int i,int j){
return j?(i-1)*N+j:N*N+i;
}
bool bfs(){
memset(d,0,sizeof(d));
queue<int>q; d[S]=1; q.push(S);
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=E.Next(u,1);i;i=E.Next(i,0)){
int v=E.to[i];
if(d[v]||!E.cap[i]) continue;
d[v]=d[u]+1; q.push(v);
}
}
return d[T];
}
int dfs(int u,int reflow){
if(u==T||!reflow) return reflow;
int flowout=0,f;
for(int &i=cur[u];i;i=E.Next(i,0)){
int v=E.to[i];
if(!E.cap[i]||d[v]!=d[u]+1) continue;
f=dfs(v,min(reflow,E.cap[i]));
flowout+=f; E.cap[i^1]+=f;
reflow-=f; E.cap[i]-=f;
if(!reflow) break;
}
if(!flowout) d[u]=0;
return flowout;
}
int dinic(){//求最小割
int flow=0;
while(bfs()){
memcpy(cur,E.head,sizeof(E.head));
flow+=dfs(S,INF);
}
return flow;
}
int main()
{
E.Init();
scanf("%d",&N); S=N*N+N+1; T=S+1;
for(int i=1,x;i<=N;i++)
for(int j=1;j<=N;j++){
scanf("%d",&x); ANS+=x;
E.Adde(S,idx(i,j),x);
E.Adde(idx(i,j),idx(i,0),INF);
E.Adde(idx(i,j),idx(j,0),INF);
}
for(int i=1,x;i<=N;i++){
scanf("%d",&x);
E.Adde(idx(i,0),T,x);
}
ANS-=dinic();
printf("%d",ANS);
return 0;
}
●BZOJ 3996 [TJOI2015]线性代数的更多相关文章
- 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]线性代数——最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3996 b[ i ][ j ] 要计入贡献,当且仅当 a[ i ] = 1 , a[ j ] ...
- bzoj 3996: [TJOI2015]线性代数
Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接 ...
- bzoj 3996: [TJOI2015]线性代数【最小割】
把转置矩阵看成逆矩阵吓傻了233 首先按照矩乘推一下式子: \[ D=\sum_{i=1}^n a[i]*(\sum_{j=1}^n a[j]*b[j][i])-c[i] \] \[ D=(\sum_ ...
- 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)
3996: [TJOI2015]线性代数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1368 Solved: 832 Description 给 ...
- 【BZOJ】3996: [TJOI2015]线性代数
题意 给出一个\(N \times N\)的矩阵\(B\)和一个\(1 \times N\)的矩阵\(C\).求出一个\(1 \times N\)的01矩阵\(A\),使得\[ D = ( A * B ...
- 【BZOJ3996】[TJOI2015]线性代数(最小割)
[BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...
- BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图
BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大. ...
- 【LG3973】[TJOI2015]线性代数
[LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...
随机推荐
- 敏捷冲刺每日报告--day2
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team ...
- 小草手把手教你LabVIEW串口仪器控制—安装使用仪器现有驱动
声明:很多仪器是没有驱动的.所以,具体问题具体分析.另外声明:所谓的驱动,也就是封装好的底层的串口通信程序,也是程序而已,只不过别人帮你做成了子 VI,让自己容易用.所以:不要弄混淆了概念.国外的很多 ...
- Django 分类标签查找
from django.conf.urls import url from django.contrib import admin from blog.views import index,stude ...
- raid5 阵列硬盘离线数据恢复成功案例
数据恢复故障描述: 某研究院 DELL 磁盘阵列崩溃,内置15块1TB硬盘搭建的RAID5阵列.一开始有一块硬盘离线,在更换新硬盘进行同步的过程中,第二块磁盘指示灯报警,同步失败,阵列无法正常工作. ...
- javascript实现小鸟飞行轨迹
javascript实现小鸟飞行轨迹 代码如下:
- vue中一个dom元素可以绑定多个事件?
其实这个问题有多个解决方法的 这里提出两点 第一种 第二种 现在dom上绑定一个 然后在你的methods中直接调用 如果要传参数 这时候千万别忘记 原创 如需转载注明出处 谢谢
- 13-TypeScript单例模式
在JavaScript中,要实现设计模式比较复杂.而在TypeScript中因为使用面向对象的思想编程,要实现设计模式的方式与后端语言C#.Java等非常类似. 单例模式是一种常用的设计模式,通常用于 ...
- C# reportview 按时间改变行颜色
//) AND ((Day(Now()) - Day() AND (Day(Now()) - Day()),) AND (Day(Now()) - Day()) OR (Month(Now()) - ...
- Microsoft Soft SQL Server 大数据----分区表性能测试
分区表 MSSQL有一个大数据储存方案,可以提高效率那就是分区表. 使用起来跟普通表没有区别.至于具体原理自己度娘吧. 真正性能的提高,是依赖于硬件的加入.也是就说,当把一个表设置成分区表,每一个分区 ...
- 电子称DIY(贴应变片+写代码)
第一步.应变片介绍 ---------------------------------------------------------------------------------------- ...