給定 n 個節點、m 條有向邊,每條邊有流量下界 low 和上界 high。無指定源匯點,要求滿足流量守恆(每點流入=流出)且所有邊流量在 [low, high] 內。判斷是否存在可行流,存在則輸出每條邊具體流量。
原邊 u→v 實際流量 = low + (原容量 - 剩餘容量) = high - 剩餘容量。
代碼中記錄每條邊在圖中的索引,跑完流後直接讀取反向邊容量即為已用流量。
struct Edge { int to, cap, rev; };
vector G[MAXN];
int level[MAXN], iter[MAXN];
void addEdge(int u, int v, int c) {
G[u].push_back({v, c, (int)G[v].size()});
G[v].push_back({u, 0, (int)G[u].size()-1});
}
bool bfs(int s) { /* 分層圖構建 */ }
int dfs(int v, int t, int f) { /* 多路增廣 */ }
int maxFlow(int s, int t) { /* Dinic 主循環 */ }
int main() {
while (cin >> n >> m) {
init();
// 1. 讀入邊,建立上述轉化圖,記錄原邊索引
// 2. maxFlow(S, T) == 總下界和 ? "可行" : "不可行"
// 3. 若可行,再跑一次 maxFlow(original_S, original_T) 最大化流量(可選)
// 4. 按輸入順序輸出每條邊流量
}
}
clear() 圖、重置陣列。int,用 long long。u, v, idx_in_G 便於最後取流量。Dinic O(E√V) 對於典型規模(V≤200, E≤1000)極快。若圖密集可考慮 ISAP 或 HLPP。