百练 OpenJ_Bailian 4124 深搜剪枝
题目大意
旅行商问题
没啥好说的,写的时候多写了个等于,删了就a了
//cd is my stdin in java with PrintWriter
//out is my stdout in java with fastio(without hard regex)
int[][] G;
int[][] vis;
int n, end;
int ans = INF;
void init() {
n = cd.nextInt();
G = new int[n][n];
vis = new int[n][(1 << 16) + 10];
end = (1 << (n - 1)) - 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
G[i][j] = cd.nextInt();
}
}
}
int orState(int val, int pos) {
return val | (1 << pos);
}
void dfs(int s, int len, int state) {
for (int i = 1; i < n - 1; i++) {
int temp = orState(state, i);
if (temp == state) continue;
//剪掉每个点超时(终点状态最大时间和当前状态最大时间)就好
if ((len + G[s][i] < vis[i][temp] || vis[i][temp] == 0) && len + G[s][i] < ans) {
vis[i][temp] = len + G[s][i];
if (temp != end) dfs(i, vis[i][temp], temp);
else ans = Math.min(vis[i][end] + G[i][n - 1], ans);
}
}
}
Solver solve() {
init();
dfs(0, 0, 1);
out.println(ans);
return this;
}