網路流24題 方格取數問題

2022-05-25 19:18:19 字數 1446 閱讀 2856

【問題描述】

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

【輸入格式】

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

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

【輸出格式】

將取數的最大總和輸出

【輸入樣例】

3 3

1 2 3

3 2 3

2 3 1

【輸出樣例】

11【資料範圍】

1<=n,m<=30

正解:網路流

解題報告:對圖進行黑白染色,然後就變成了乙個二分圖,然後就是套結論二分圖最大獨立集等於權值和減去最小割。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9

#define rg register

10#define min(a,b) a11

const

int n = 10000;12

const

int inf = 2147483641;13

14using

namespace

std;

1516

intgi()

2223

struct

datenn[n];

2627

int h[n],vis[n],f[n],head[n],cnt=1

,jl[n],gg;

28int

s,t,ans,kk;

2930

void link(int l,int r,int

val),head[l]=cnt;

32 nn[++cnt]=(date),head[r]=cnt;

33return;34

}3536int

bfs()

48if (vis[t]) return1;

49}50return0;

51}5253

int dinic(int xh,int

sum)

63if (s==0) vis[xh]=-1;64

return

s;65}66

67int

main()

86else

87 link(k+j,t,f[k+j]);88}

89}90while(bfs()) ans+=dinic(s,inf);

91 printf("

%d",kk-ans);

92return0;

93 }

24題 方格取數問題 網路流

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

網路流24題 方格取數問題

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

網路流24題 方格取數問題

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