方格取數問題

2022-05-23 08:21:13 字數 992 閱讀 3955

點我網路流

考慮先將棋盤黑白染色變成二分圖,這樣使得每個格仔有公共邊的其他格仔和它自己都是異色的,然後把它向其他四個方向的點連一下邊,邊容量\(inf\),\(s\)連黑點,容量為權值,白點連\(t\),容量同理

於是問題轉化為乙個最小割問題

#include#define inf (1000000000 + 7)

#define n (100000 + 10)

using namespace std;

inline int read()

while (isdigit(c))

return cnt * f;

}const int fx[5] = ;

const int fy[5] = ;

int m, n, s, t, first[n << 2], nxt[n << 2], to[n << 2], flow[n], tot = 1, dep[n], cnt[n], ans;

void add(int x, int y, int z)

int map[110][110];

queue q;

void build ()

for (register int i = 1; i <= m; ++ i)

for (register int j = 1; j <= n; ++j) }}}

void bfs_(int t)

} }}int max_flow;

int dfs_(int p, int f)

int u = 0;

for (register int i = first[p]; i; i = nxt[i])

if (u >= f) return u;

} }if (!--cnt[dep[p]]) dep[s] = m * n + 3;

++cnt[++dep[p]];

return u;

}int main()

題解 方格取數問題

傳送門 在乙個有 m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。這個題目也是很明顯的網路流,奇偶性建圖,最後總和 最小割即為答案 i...

題解 方格取數問題

題目戳我 text 相鄰的不能取 黑白染色。染色完之後,我們需要對不能同時選擇的點連線一條流量為 infty 的邊,以保證它們不被割開。即,被割開的一定是連向 s 或 t 的之前連過的邊,邊權是點權。上述連邊保證圖聯通,並保證割掉的邊一定是之前連的邊權為點權的邊。如果不連 infty 的邊,則原圖本...

方格取數 1

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...