bzoj3996 TJOI2015 線性代數

2021-08-04 23:46:25 字數 1230 閱讀 1584

首先轉化題目: 給你n

個物品,可以選或不選。 選第i

個物品需要c[

i]的代價。

同時選第

i 和第

j個物品獲得b[

i][j

] 的收益

問最大收益。

網路流建圖: 考慮s

um=∑

ni=1

∑nj=

1b[i

][j]

剩下就變成了算代價最小(也就是最小割) 建點(

i,j)

和i,對於每個點(i

,j),向

i,j 連一條容量為in

f 的邊。

s 向每個點(i

,j)連一條容量為b[

i][j

] 的邊

每個點i

向t連一條容量為c[

i]的邊。

然後跑最大流就好。

#include 

#define gc getchar()

#define ll long long

#define n 509

#define inf 0x3f3f3f3f

using

namespace

std;

int n,b[n][n],c[n],sum;

int number=1,pos,cur[n*n],dis[n*n];

bool vis[n*n];

vector

g[n*n];

struct edge

void add(int x,int y,int z)

}e[n*n<<3];

void add(int x,int y,int z)

#define e e[g[x][i]]

bool bfs(int s,int t)

}return vis[t];

}int dfs(int x,int a,int t)

return flow;

}int maxflow(int s,int t)

return flow;

}#undef e

int read()

int main()

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

printf("%d\n",sum-maxflow(0,n*n+n+1));

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 線性代數

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

BZOJ 3996 TJOI2015 線性代數

題鏈 題解 好題啊。不太熟悉矩陣相關,所以按某些博主的模型轉換來理解的 首先,那個式子可以化簡為 d 某個數 a b a c a a 為 a的倒置矩陣 因為 a 為 01 矩陣,把其考慮為 n個物品選或不選,c i 對應為i物品的花費,而b i,j 對應為同時選了i,j兩個物品後帶來的價值。所以結合...