这个题目和最近那个 AtCoder T4很像,不过这个是简单版的。
只需要m个点依次经过就可以了。。
#include <bits/stdc++.h> using namespace std; int dis[2005][2005]; int tot=0,vis[205]; int n,m,r,Start; int R[10005]; int x,y,z; void floyd(){ for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { if (i == k) continue; for (int j = 1; j <= n; j++) { if (i == j || k == j) continue; dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&R[i]); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&dis[i][j]); } } floyd(); R[0]=1; R[m+1]=n; for(int i=1;i<=m+1;i++){ tot+=dis[R[i-1]][R[i]]; } printf("%d\n",tot); return 0; }