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;
}
浙公网安备 33010602011771号