網路流24題 方格取數問題

2022-03-07 09:06:07 字數 1401 閱讀 2671

題面:

傳送門思路:

相鄰的點不能同時取,那麼在這個圖中,實際上分了兩種格仔,每種格仔相互之間隨便取

那麼就是二分圖了

把相鄰的點之間連邊,得到乙個二分圖,我們實際上就是要求這個圖的帶權最大獨立集

於是這道題轉化為二分圖問題,而二分圖中最大獨立集等於全集減去最小點覆蓋,最小點覆蓋等於這個圖的最大匹配(都帶權)

那麼用網路流做就好了

將這個平面上的方格像西洋棋那樣黑白染色

源點連黑點,容量為黑點權值

黑點連白點,容量為inf

白點連匯點,容量為白點權值

跑s-t最大流(即s-t最小割),用所有點的權值和減去最大流值,就得到了答案

因為在這個建好的網路流圖裡面,最大流等於最小割等於最小點覆蓋

code:

建圖比較醜,請見諒

1     #include2     #include3     #include4     #include5

#define inf 0x7fffffff

6using

namespace

std;

7 inline int

read()

13while(ch>='

0'&&ch<='

9') re=(re<<1)+(re<<3)+ch-'

0',ch=getchar();

14return re*flag;15}

16 inline int _min(int l,int r)

17const

int dx[5]=,dy[5]=;

18int n,m,cnt=-1,ans,x[50][50],first[2500],dep[2500],cur[2500

];19

struct

edgea[500010

];22 inline void add(int u,int v,int

w)27 inline bool bfs(int s,int

t)41

//system("pause");42}

43return dep[t]!=inf;44}

45int dfs(int u,int t,int

low)57}

58//

cout<<"return "<59

return

flow;60}

61void

dinic()

64int

main()81}

82}83dinic();

84 printf("

%d",-ans);

85 }

24題 方格取數問題 網路流

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

網路流24題 方格取數問題

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

網路流24題 方格取數問題

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