http://www.lydsy.com/JudgeOnline/problem.php?id=1025
给出\(n\)个点以及之间的边的长度,给出必须访问的点的顺序,求最短路线长度.
分析
用Floyd求多源最短路,然后加起来就好了.
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=100+5,maxm=10000+5; 5 int n,m,ans; 6 int a[maxm]; 7 int d[maxn][maxn]; 8 inline int read(int &x){x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k;} 9 int main(){ 10 read(n); read(m); 11 for(int i=1;i<=m;i++) read(a[i]); 12 for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) read(d[i][j]); 13 for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) 14 d[i][j]=min(d[i][j],d[i][k]+d[k][j]); 15 for(int i=1;i<m;i++) ans+=d[a[i]][a[i+1]]; 16 printf("%d\n",ans); 17 return 0; 18 }