混合圖包含有向邊與無向邊。判斷是否存在歐拉回路(恰好走過每條邊一次並回到起點)。
直接計算每個頂點的淨流量:in[v] - out[v]。有向邊固定貢獻。
struct Edge { int v, w, next; } e[MM];
int head[MN], vis[MN], cnt;
bool bfs(int s, int t) { ... } // 分層圖
int dfs(int u, int flow, int t) { ... } // 阻塞流
int dinic(int s, int t) { ... } // 主循環
注意:邊數上限 MM = 100005,點數 MN = 500,需開足夠大數組。
bool solve(int n, int m) {
// 1. 初始化
memset(head, -1, sizeof(head));
memset(in, 0, sizeof(in));
cnt = 0;
// 2. 處理有向邊,計算 in[]
for (i = 0; i < m; i++) {
--in[u], ++in[v];
if (!directed) add(u, v, 1); // 無向邊加入流網絡
}
// 3. 檢查奇數度
for (i = 1; i <= n; i++) if (in[i] & 1) return false;
// 4. 建立超級源匯
int sum = 0;
for (i = 1; i <= n; i++) {
if (in[i] < 0) add(0, i, -in[i]/2);
if (in[i] > 0) add(i, n+1, in[i]/2), sum += in[i]/2;
}
// 5. 最大流判斷
return sum == dinic(0, n+1);
}
混合圖歐拉回路 = 度數平衡 + 方向分配可行性。將「無向邊選方向」轉化為「流量分配」,是將組合決策問題降維為網絡流的經典範例。