網路流24題 方格取數問題

2022-05-02 05:54:09 字數 1630 閱讀 2702

在乙個有m * n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。

第1 行有2 個正整數m和n,分別表示棋盤的行數和列數。

接下來的m行,每行有n個正整數,表示棋盤方格中的數。

將取數的最大總和輸出

3 3

1 2 3

3 2 3

2 3 1

資料範圍:

1<=n,m<=30

正解:二分圖最大獨立集。

乙個二分圖的最大獨立集等於點權和-最小割。

然後這題點權不為1,所以不能用匈牙利演算法,只能用最大流。

//

it is made by wfj_2048~

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf (1<<30)

#define il inline

#define rg register

#define ll long long

#define c(i,j) ( (i-1)*m+j )

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

using

namespace

std;

struct edgeg[200010

];int head[20010],vis[20010],d[20010],q[20010],g[110][110],a[110][110],n,m,s,t,tot,num=1

;il

intgi()

il void insert(rg int

from,rg int to,rg int cap),head[from]=num; return

; }il

int bfs(rg int s,rg int

t) }

return

vis[t];

}il

int dfs(rg int x,rg int t,rg int

a) g[i].flow+=f,g[i^1].flow-=f;

flow+=f,a-=f; if (a==0) return

flow;}}

return

flow;

}il

int maxflow(rg int s,rg int t)

il void

work()

else a[i][j]=1,insert(c(i,j),t,g[i][j]),insert(t,c(i,j),0

); }

printf(

"%d\n

",tot-maxflow(s,t)); return;}

intmain()

24題 方格取數問題 網路流

在乙個有 n m n times m n m 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。這道題明顯是乙個二分圖。我們可以把每個點染色,將i j i ji j為偶數的點連向t tt,否則連向s ss。那麼對於每乙個連s ss的白...

網路流24題 方格取數問題

題面 傳送門思路 相鄰的點不能同時取,那麼在這個圖中,實際上分了兩種格仔,每種格仔相互之間隨便取 那麼就是二分圖了 把相鄰的點之間連邊,得到乙個二分圖,我們實際上就是要求這個圖的帶權最大獨立集 於是這道題轉化為二分圖問題,而二分圖中最大獨立集等於全集減去最小點覆蓋,最小點覆蓋等於這個圖的最大匹配 都...

網路流24題 方格取數問題

題目鏈結 有乙個 m 行 n 列的方格圖,每個方格中都有乙個正整數。現要從方格中取數,使任意兩個數所在方格沒有公共邊,且取出的數的總和最大,請求出最大的和。第一行是兩個用空格隔開的整數,分別代表方格圖的行數 m 和列數 n 第 2 到第 m 1 m 1 行,每行 n 個整數,第 i 1 i 1 行的...