http://codeforces.com/contest/295/problem/B
floyd 算法的本质是动态规划 只有理解其中动态规划的原理 才能更好的运用
代码:
#include#include #include #include #include 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< <<" "; cout<