ORIGIN PROBLEM

题目大意

旅行商问题

没啥好说的,写的时候多写了个等于,删了就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;
}