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<<2];

int n,B[1010][1010],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],0};   g[y]=totE;
}

bool bfs(){
    memset(v,0,sizeof(v));
    q.push(S); h[S]=1; v[S]=1;
    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]+1;
                q.push(p); v[p]=1;
            }
    }
    return v[T];
}

int dinic(int x,int flow){
    if(x==T||!flow) return flow;
    int f=0;
    for(int i=g[x];i&&flow;i=E[i].to)
        if(h[p]==h[x]+1&&E[i].cap){
            int tmp=dinic(p,min(flow,E[i].cap));
            E[i].cap-=tmp; E[i^1].cap+=tmp;
            f+=tmp; flow-=tmp;
        }
    if(!f) h[x]=-1;
    return f;
}

int main(){
    scanf("%d",&n);
    for(int i=1,j;i<=n;i++)
        for(j=1;j<=n;j++) scanf("%d",&B[i][j]);
    for(int i=1;i<=n;i++) scanf("%d",&C[i]);
    S=n*n+n+1; T=S+1;
    for(int i=1;i<=n;i++) ade(i,T,C[i]);
    int ans=0;
    tot=n;
    for(int i=1;i<=n;i++)
        for(int j=1;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 0;
}

时间: 2024-10-21 01:46:47

BZOJ3996 线性代数的相关文章

[TJOI2014] [Bzoj3996] 线性代数 [网络流,最小割]

由原式,可以推出D=Σ(i=1,n,Σ(j=1,n,A[i]*A[j]*B[i][j]))-Σ(i=1,n,A[i]*C[i]),故建图方法如下:由源点像第一层n*n个点连边,边权为B[i][j],由第一层像第二层连边,边权正无穷,由第二层向汇点连边,边权C[i].最终答案为Σ(B)-MAXFLOW. 推导过程: (A * B - C) * AT (1*n)        (n*n)       (1*n)        (n*1) =A*B    *     AT   -   C * AT (

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,接下来N行输入B矩阵,第i行第J个数字代表Bij. 接下来一行输入N个整数,代表矩阵C.矩阵B和矩阵C中每个数字都是不超过1000的非负整数. Output 输出最大的D Sample Input 3 1 2 1 3 1 0 1 2 3 2 3 7 Sample Output 2 HINT 1<=N<

【BZOJ3996】【TJOI2015】线性代数 最小割

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45200381"); } 题解: 题意部分注释:最终的矩阵 D 长宽都1,所以其实要求的是一个数 首先 (A×B?C)×AT=A×B×AT?C×AT 然后发现 左边式子 Ai 和 ATj 都选的时候才会得到 Bi,j 的价值 如果 A

【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矩阵,第i行第J个数字代表Bij. 接下来一行输入N个整数,代表矩阵C.矩阵B和矩阵C中每个数字都是不超过1000的非负整数. 输出 输出最大的D 样例输入 3 1 2 1 3 1 0 1 2 3 2 3 7 样例输出 2 题解 网络流最大权闭合图 (推导过程什么的不重要,只要注意一下矩阵乘法不满足结合律

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])这样建图后我们删去的那个最小割意义就是花费最少的使得整个图不连通的量 如果删在左边就意味着这件物品我们不要了,如果删去右边的话

深度学习(deeplearing)(5月完成)共三部分 第一部分应用数学与机器学习(5.1-5.10)线性代数

第一章:线性代数: 学习一个新东西,首先要从概念开始,抓住其核心点 机器学习相关问题中,数据集多是以矩阵的形式存在,而模型的参数如W也是以矩阵或向量的形式存在,所以一个模型从数学的角度来说,就是矩阵间的运算,而运算中矩阵相乘的运算又是最常用的运算.本章后半部分讲解了在机器学习中会用到的一些矩阵运算的概念,如范数.行列式. 特征分解.奇异值分解等 一.基本单元:标量.向量.矩阵.张量 二.

数学的奇妙世界(1)- 引言和线性代数

0. 背景 在这个学校里面遇到了本科是学习统计学的小猪,给我打开了数学的大门,前段时间想着自己机器学习和视觉上一直跌跌撞撞,除了因为去年闹眼病搞得今年有空就睡觉外,还有一点就是自己不想看到数学,前几天自己在京东趁着打折给自己买了一本<陶哲轩教你聪明解数学>,看完前言和第一章仿佛开了天眼, 15 岁天才对于数学的理解可以给我这个 15*2 的学沫启蒙,顺便前言中提到了<如何解题>,让我对另一本早已买来的懵懵懂懂的书籍有了新的认识. 跟着陶哲轩老师的思路自己"在老师后面&qu

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

最小方差解释(线性代数看PCA)

PCA降维                         ——最小方差解释(线性代数看PCA)    注:根据网上资料整理而得,欢迎讨论 机器学习算法的复杂度和数据的维数有着密切关系,甚至与维数呈指数级关联.因此我们必须对数据进行降维. 降维当然意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低. PCA是一种具有严格数学基础并且已被广泛采用的降维方法. 协方差矩阵及优化目标 如果我们必须使用一维来表示这些数据,又希望尽量保留原始的信息,你要