BZOJ3996 TJOI2015 線性代數

2022-05-16 02:54:40 字數 1041 閱讀 6312

給定\(n*n\)的矩陣\(b\)和\(1*n\)的矩陣\(c\)。求乙個\(1*n\)的01矩陣\(a\)使得\((ab-c)a^t\)最大。\(a^t\)是\(a\)的轉置。\(n\leq500\),所有輸入為不超過\(1000\)的非負整數。

\[\begin

(ab)_i&=\sum_^n a_jb_\\

(ab-c)_i&=\left(\sum_^n a_jb_\right) - c_i\\

(ab-c)a^t&=\sum_^n a_i\left(\sum_^na_jb_\right)-a_ic_i\\

&=\sum_ a_ia_jb_ -\sum_^na_ic_i

\end

\]觀察最後乙個式子,可以看成:

\(n\)個物品,第\(i,j\)兩個物品同時選會獲得\(b_\)的收益;選第\(i\)個物品會付出\(c_i\)的代價;求最大淨收益。

最小割即可。

#include #include #include const int n = 500;

const int nn = 500000;

const int m = 3000050;

int pre[nn], nxt[m], to[m], ret[m], cnt;

int dis[nn], que[nn];

bool bfs(int s, int t)

int dfs(int x, int t, int maxf)

if (ans < maxf) dis[x] = -1;

return ans;

}int solve(int s, int t)

inline void addedge(int x, int y, int c)

int main()

for (int i = 0, v; i < n; ++i)

printf("%d\n", ans - solve(s, t));

return 0;

}

BZOJ 3996 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的非負整數。輸...

bzoj3996 TJOI2015 線性代數

首先轉化題目 給你n 個物品,可以選或不選。選第i 個物品需要c i 的代價。同時選第 i 和第 j個物品獲得b i j 的收益 問最大收益。網路流建圖 考慮s um ni 1 nj 1b i j 剩下就變成了算代價最小 也就是最小割 建點 i,j 和i,對於每個點 i j 向 i,j 連一條容量為...

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中每個...