點我網路流
考慮先將棋盤黑白染色變成二分圖,這樣使得每個格仔有公共邊的其他格仔和它自己都是異色的,然後把它向其他四個方向的點連一下邊,邊容量\(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...