N×M 網格,每格有移動次數上限。可交換相鄰(8 方向)兩格棋子。給定初始/目標黑棋分布,求最少步數使所有黑棋到達目標位置。
in 和出點 out,連邊 in→out,容量 (limit + is_in + is_out)/2,費用 2。out→in 連邊,容量 INF,費用 0。in 連邊,容量 1,費用 -1。out 向匯點 T 連邊,容量 1,費用 -1。struct MinCostMaxFlow {
// ... 加邊、SPFA、EdmondsKarp 實現
int EdmondsKarp() {
int cost = 0, flow = 0;
while (SPFA()) {
int f = INF;
for (int i = T; i != S; i = from[i]) f = min(f, flow[p[i]]);
for (int i = T; i != S; i = from[i]) {
flow[p[i]] -= f; flow[p[i]^1] += f;
}
cost += f * f[T]; flow += f;
}
return flow == blacks ? (cost >> 1) : -1;
}
};