BZOJ 3996 TJOI2015 線性代數

2022-03-18 06:24:27 字數 1125 閱讀 9534

題鏈:

題解:

好題啊。

(不太熟悉矩陣相關,所以按某些博主的模型轉換來理解的)

首先,那個式子可以化簡為

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#include#include#include#define maxn 505*505

#define inf 0x3f3f3f3f

using namespace std;

struct edge

void adde(int u,int v,int w)

int next(int i,bool type)

}e;int cur[maxn*2],d[maxn*2];

int n,s,t,ans;

int idx(int i,int j)

bool bfs()

} return d[t];

}int dfs(int u,int reflow)

if(!flowout) d[u]=0;

return flowout;

}int dinic()

return flow;

}int main()

for(int i=1,x;i<=n;i++)

ans-=dinic();

printf("%d",ans);

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