給定\(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中每個...