洛谷P1171 售货员的难题

题目背景

*数据有更改*

题目描述

某乡有 $n\ (2\le n\le 20)$ 个村庄,有一个售货员,他要到各个村庄去售货,各村庄之间的路程 $s\ (0<s<1000)$ 是已知的,且 $A$ 村到 $B$ 村与 $B$ 村到 $A$ 村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为 $1$,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。

输入格式

村庄数 $n$ 和各村之间的路程(均是整数)。

第一行,第 $i+1$ 行第 $j$ 个数代表村庄 $i$ 到 $j$ 的单向路径的路程。

输出格式

最短的路程。

样例 #1

样例输入 #1

3 0 2 1 1 0 2 2 1 0

样例输出 #1

3

80分答案

#include <bits/stdc++.h> using namespace std; int n, minx = 1e9, a[30][30], b[30]; void dfs(int k, int x, int step) { if (step > minx) return; if (k == n && step + a[x][1] < minx) { minx = step + a[x][1]; return; } for (int i = 1; i <= n; i++) { if (i != x && b[i] == 0) { b[i] = 1; dfs(k + 1, i, step + a[x][i]); b[i] = 0; } } } int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &a[i][j]); } } b[1] = 1; dfs(1, 1, 0); cout << minx; return 0; }