BZOJ 1475 方格取數 最小割

2021-08-10 02:48:17 字數 944 閱讀 3537

在乙個n*n的方格裡,每個格仔裡都有乙個正整數。從中取出若干數,使得任意兩個取出的數所在格仔沒有公共邊,且取出的數的總和盡量大。

建圖比較巧妙。將方格看成01奇偶矩陣,黑白染色。將s與所有黑點連邊,權為黑點的權值,將所有白點與t連邊,權為白點的權值,相鄰格仔之間從黑點到白點連邊,權為inf。答案就是總數減去最小割。

#include

#include

#include

#define maxn 36

#define inf 1000000000

#define id(x,y) ((x-1)*n+y)

using namespace std;

inline char nc()

inline int _read()

const int flag[4][2]=,,,};

int n,tot,s,t,ans,all,a[maxn][maxn],dep[maxn*maxn

*2],cur[maxn*maxn

*2],que[maxn*maxn

*2],lnk[maxn*maxn

*2],son[maxn*maxn

*16],nxt[maxn*maxn

*16],c[maxn*maxn

*16],f[maxn*maxn

*16];

void add(int

x,int

y,int z)

bool check(int

x,int

y)bool bfs()

int dfs(int

x,int w)

}return w-sum;

}int main()

while(bfs())

printf("%d\n",all-ans);

return

0;}

bzoj1475 方格取數(最小割)

題目傳送門 水。解法 沒有公共邊也就是格仔不相鄰。那麼把整個圖黑白染色。相鄰的顏色不一樣。那麼就最小割唄。把所有點個成兩個集合。乙個黑色點的集合,乙個白色點的集合。黑色點都沒有公共邊白色點也沒有公共點。好水的最小割做完前面的題發現這道才是最水的。實現 include include include ...

bzoj1475 方格取數 網路流最小割

題目描述 在乙個n n的方格裡,每個格仔裡都有乙個正整數。從中取出若干數,使得任意兩個取出的數所在格仔沒有公共邊,且取出的數的總和盡量大。輸入第一行乙個數n n 30 接下來n行每行n個數描述乙個方陣 輸出僅乙個數,即最大和 樣例輸入 21 2 3 5樣例輸出6題解 網路流最小割 將原圖黑白染色,分...

bzoj 1475 方格取數

在乙個n n的方格裡,每個格仔裡都有乙個正整數。從中取出若干數,使得任意兩個取出的數所在格仔沒有公共邊,且取出的數的總和盡量大。第一行乙個數n n 30 接下來n行每行n個數描述乙個方陣 僅乙個數,即最大和 21 2 3 56 同1324 exca王者之劍。最大流。都一樣。n m的矩形變成n n i...