http://codeforces.com/contest/295/problem/B
floyd 算法的本质是动态规划 只有理解其中动态规划的原理 才能更好的运用
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int N=505; int a[N][N]; int b[N]; long long sum[N]; int main() { //freopen("data.in","r",stdin); int n; while(cin>>n) { memset(sum,0,sizeof(sum)); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { cin>>a[i][j]; } for(int i=1;i<=n;++i) cin>>b[i]; for(int k=n;k>=1;--k) { for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { a[i][j]=min(a[i][j],a[i][b[k]]+a[b[k]][j]); } for(int i=k;i<=n;++i) for(int j=k;j<=n;++j) { sum[k]+=(a[b[i]][b[j]]); } } for(int i=1;i<=n;++i) cout<<sum[i]<<" "; cout<<endl; } return 0; }