赞
踩
分析一下题目,我们看到数据量只有一百,这个时候我们就要注意是否是要用弗洛伊德算法,然后接着我们还需要枚举每一种情况,我们可以用到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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。