分析一下题目,我们看到数据量只有一百,这个时候我们就要注意是否是要用弗洛伊德算法,然后接着我们还需要枚举每一种情况,我们可以用到next_permutation这个方法
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int dp[N][N];
int n;
int p;
int a[15];
int main(){
cin >> n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> dp[i][j];
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
cin >> p;
for(int i=1;i<=p;i++){
cin >> a[i];
}
sort(a+1,a+1+p);
int ans = 0x7fffffff;
if(p==0){
cout << dp[1][n];
return 0;
}
do{
int sum = dp[1][a[1]] + dp[a[p]][n];
for(int i=1;i<=p-1;i++){
sum += dp[a[i]][a[i+1]];
}
ans = min(ans,sum);
}while(next_permutation(a+1,a+1+p));
cout << ans;
return 0;
}