網路流24題 方格取數問題

2022-05-23 22:42:13 字數 1423 閱讀 4732

題目鏈結

有乙個 $m$行 $n$列的方格圖,每個方格中都有乙個正整數。現要從方格中取數,使任意兩個數所在方格沒有公共邊,且取出的數的總和最大,請求出最大的和。

第一行是兩個用空格隔開的整數,分別代表方格圖的行數 $m$ 和列數 $n$。

第 $2$到第  $(m + 1)$$(m + 1)$

行,每行 $n$個整數,第 $(i + 1)$$(i + 1)$行的第 $j$個整數代表方格圖第 $i$ 行第 $j$ 列的的方格中的數字 $a$ 。

輸出一行乙個整數,代表和最大是多少。

前置:

二分圖最大點權獨立集:選取一些點使得任意兩點間沒有邊相連

二分圖最小點權覆蓋集:選取一些點使得任意一條邊的兩個端點至少有乙個被選中

大點權獨立集 == 所有點權和 - 最小點權覆蓋集

為什麼最大點權獨立集 == 所有點權和 - 最小點權覆蓋集 == 所有點權和 - 最小割呢?

一、"最大點權獨立集 == 所有點權和 - 最小點權覆蓋集" :

二、"所有點權和 - 最小點權覆蓋集 == 所有點權和 - 最小割" : 

#include #include 

#include

#include

#include

#define inf 2e9

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

using

namespace

std;

const

int _ = 10005

;int

n, m, s, t, ans;

struct

edge e[

1000005

]; int cnte = 1

, head[_];

inline

void add_edge(int i, int j, int

k) int

dep[_];

bool

bfs() }}

return

dep[t];

}int dfs(int u, int

in)

}if(!out) dep[u] = 0

;

return

out;

}int

main()

else

add_edge(p(i, j), t, x);

}}

while(bfs()) ans -=dfs(s, inf);

cout

<< ans << '\n'

;

return0;

}

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個...