dp[S, i] = min(dp[S{i}, j] + dis(j, i)), 其中j∈S{i}
其中dis(j, i)表示从点j到i的距离,如果(i, j)不在图中,则dis(j, i)=∞。 4. 初始化:dp[∅, s] = 0。 5. 求解原问题:对于所有的标记点组合,使用该算法求解,并选择最小的路径作为最终解。时间复杂度为O(n22n)。
代码示例:
int n, m; int g[N][N]; // 存图 int f[1 << N][N]; // f[S][i]表示经过的点集为S,以i为终止点的最短路 int A[N], B[N], cnt; // A, B分别表示两个必经点集合,cnt记录选中的点数量 int d[N][N]; // d[i][j]表示i到j的距离 int main() { cin >> n >> m; memset(g, 0x3f, sizeof g); for (int i = 0; i < m; i++) { int a, b, w; cin >> a >> b >> w; g[a][b] = min(g[a][b], w); } int x; cin >> x; while (x--) { int a