首先轉化題目: 給你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兩個物品後帶來的價值。所以結合...