题意

给出一个\(N \times N\)的矩阵\(B\)和一个\(1 \times N\)的矩阵\(C\)。求出一个\(1 \times N\)的01矩阵\(A\),使得$$ D = ( A * B - C ) * A^T $$最大,其中\(A ^ T\)是矩阵\(A\)的转置。(\(n<=500\))

分析

好神的题。首先我们容易推出一个式子:

\[D = \sum_{i=1}^{n} \sum_{j=1}^{n} a_i \times a_j \times b_{i, j} - \sum_{i=1}^{n} a_i \times c_i
\]

题解

选\(b_{i, j}\)则必须选\(a_i\)、\(a_j\),而选\(a_i\)就必须选\(c_i\)。

那么可以看成:

\(a_i\)为一个点,权值为\(-c_i\),表示选了\(a_i\)就必须选\(c_i\)

\(b_{i, j}\)为一个点,权值为\(b_{i, j}\),向\(a_i、a_j\)连有向边,表示选了\(b_{i, j}\)就必须选\(a_i、a_j\)。

于是问题变成求最大权闭合子图....

由于某种原因,这个网络流跑的飞起?似乎成了二分图复杂度变成\(O(mn^{0.5})\)了?感觉不科学啊QAQ

#include <bits/stdc++.h>
using namespace std;
inline int getint() {
int x=0, c=getchar();
for(; c<48||c>57; c=getchar());
for(; c>47&&c<58; x=x*10+c-48, c=getchar());
return x;
}
const int N=605, vN=N*N+N, oo=~0u>>1;
int ihead[vN], cnt=1;
struct E {
int next, to, cap;
}e[6*N*N+2*N];
inline void add(int x, int y, int cap) {
e[++cnt]=(E){ihead[x], y, cap}; ihead[x]=cnt;
e[++cnt]=(E){ihead[y], x, cap}; ihead[y]=cnt;
}
inline int min(const int &a, const int &b) {
return a<b?a:b;
}
int isap(int s, int t, int n) {
static int gap[vN], cur[vN], d[vN], p[vN];
gap[0]=n;
int r=0, x=s, i, f;
for(; d[s]<n;) {
for(i=cur[x]; i && !(e[i].cap && d[x]==d[e[i].to]+1); i=e[i].next);
if(i) {
p[e[i].to]=cur[x]=i;
if((x=e[i].to)==t) {
for(f=oo, x=t; x!=s; f=min(f, e[p[x]].cap), x=e[p[x]^1].to);
for(r+=f, x=t; x!=s; e[p[x]].cap-=f, e[p[x]^1].cap+=f, x=e[p[x]^1].to);
}
}
else {
if(!--gap[d[x]]) break;
d[x]=n;
for(i=ihead[x]; i; i=e[i].next) {
if(e[i].cap && d[x]>d[e[i].to]+1) {
d[x]=d[e[i].to]+1;
cur[x]=i;
}
}
++gap[d[x]];
if(x!=s) x=e[p[x]^1].to;
}
}
return r;
}
int main() {
int n=getint(), sum=0, S, T;
S=n*(n+1)+1, T=S+1;
for(int i=1; i<=n; ++i) {
for(int j=1; j<=n; ++j) {
int id=i*n+j, w=getint();
add(id, T, w);
if(i!=j) add(i, id, oo);
add(j, id, oo);
sum+=w;
}
}
for(int i=1; i<=n; ++i) {
add(S, i, getint());
}
printf("%d\n", sum-isap(S, T, T));
return 0;
}

【BZOJ】3996: [TJOI2015]线性代数的更多相关文章

  1. bzoj 3996: [TJOI2015]线性代数 [最小割]

    3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...

  2. ●BZOJ 3996 [TJOI2015]线性代数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3996 题解: 好题啊.(不太熟悉矩阵相关,所以按某些博主的模型转换来理解的)首先,那个式子可 ...

  3. bzoj 3996 [TJOI2015]线性代数——最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3996 b[ i ][ j ] 要计入贡献,当且仅当 a[ i ] = 1 , a[ j ] ...

  4. 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,接 ...

  5. bzoj 3996: [TJOI2015]线性代数【最小割】

    把转置矩阵看成逆矩阵吓傻了233 首先按照矩乘推一下式子: \[ D=\sum_{i=1}^n a[i]*(\sum_{j=1}^n a[j]*b[j][i])-c[i] \] \[ D=(\sum_ ...

  6. 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)

    3996: [TJOI2015]线性代数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1368  Solved: 832 Description 给 ...

  7. 【BZOJ3996】[TJOI2015]线性代数(最小割)

    [BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...

  8. BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图

    BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大. ...

  9. 【LG3973】[TJOI2015]线性代数

    [LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...

随机推荐

  1. 页面解耦—— 统跳协议和Rewrite引擎

    原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...

  2. js replaceAll

    js 全部替换: /** * 替换(所有) * @param str 要处理的字符串 * @param beRepStr 被替换的字符串 * @param toRepStr 最终生成的字符串 * @r ...

  3. 4541: [Hnoi2016]矿区

    学习了一下平面图剖分的姿势,orz cbh 每次只要随便选择一条边,然后不停尽量向左转就行 #include <bits/stdc++.h> #define N 1300000 #defi ...

  4. linux查看安装文件

    rpm -qa jdk 查看名字包含"jdk"的已安装的文件 which java 查看java命令的所在目录 rpm -qf `which java` 查看java命令所对应的安 ...

  5. 如何将 Windows Server 2012 r2 打造成 Windows 8.1?

    Server 系列相对于桌面系统Windows 8.1 .嵌入式系统Embedded 8.1来说,还是有所不同的,有其独特性,所以,标题写着“打造”充其量不过是不断接近的意思.还有很多地方存在进一步深 ...

  6. 如何在Linux上使用文件作为内存交换区(Swap Area)

    交换区域(Swap Area)有什么作用? 交换分区是操作系统在内存不足(或内存较低)时的一种补充.通俗的说,如果说内存是汽油,内存条就相当于油箱,交换区域则相当于备用油箱. Ubuntu Linux ...

  7. memcache的内存管理探微

    slab分配器:http://blog.csdn.net/luotuo44/article/details/42737181 hash操作  :http://blog.csdn.net/luotuo4 ...

  8. 多预览小图焦点轮播插件lrtk

    多预览小图焦点轮播插件lrtk // JavaScript Document $(document).ready(function(){ //$('#select_btn li:first').css ...

  9. Java POI 解析word文档

    实现步骤: 1.poi实现word转html 2.模型化解析html 3.html转Map数组 Map数组(数组的操作处理不做说明) 1.导jar包. 2.代码实现 package com.web.o ...

  10. cout 格式化输出

    一直习惯于C语言的printf函数来打印,突然有一天要用cout来打印,发现有点不适应. 原来cout也是有格式化输出的. 首先要引入头文件 #include<iostream> // 在 ...