n≤30 個星球,完全圖給定旅行時間 Txy。從 1 號出發訪問所有星球,到達星球 x 時間 ≤ Deadline[x]。最小化所有星球到達時間之和。不可行輸出 -1。
g[i][j](可能繞路更快)。(當前星球, 累計時間, 當前到達時間, 剩餘星球數)。累計時間 + 當前到達時間 * 剩餘數 ≥ 當前最優解 剪枝(樂觀估計)。Deadline 是否 ≥ 下一到達時間,否則剪枝。void dfs(int u, int sumTime, int curTime, int left) {
if (left == 0) { ans = min(ans, sumTime); return; }
for (int v=1; v<=n; v++) if (!vis[v]) {
int arrive = curTime + g[u][v];
if (sumTime + arrive*(left-1) >= ans) continue; // 剪枝1
bool ok = true;
for (int j=1; j<=n; j++) if (!vis[j] && deadline[j] < arrive) { ok=false; break; }
if (!ok) continue; // 剪枝2
vis[v]=1; dfs(v, sumTime+arrive, arrive, left-1); vis[v]=0;
}
}
30! 極大,但雙重剪枝極其有效,實際搜索節點極少。O(n³)=27000 可忽略。ans 初始化為 INF,找不到保持 INF 輸出 -1。