暴力搜索即可,使用 STL 全排列函数 next_permutation,详细见注释。
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 35;
const int MAXP = 10;
int dis[MAXN][MAXN]; //车站间的距离
int to[MAXP]; //各乘客的到达车站
int main()
{
int N;
while (scanf("%d", &N))
{
if (N == 0)
break;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
scanf("%d", &dis[i][j]);
}
int K;
scanf("%d", &K);
for (int i = 0; i < K; i++)
{
scanf("%d", &to[i]);
}
sort(to, to + K);
int minDis = 0x3f3f3f3f; //最短距离
do
{
int total = dis[0][to[0]]; //总距离
for (int i = 0; i < K - 1; i++)
total += dis[to[i]][to[i + 1]];
if (total < minDis)
minDis = total;
} while (next_permutation(to, to + K)); //计算下一个全排列
printf("%d\n", minDis);
}
return 0;
}
继续加油。