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 }
View Code

相关文章: