首页 > 代码库 > CodeForces 295B

CodeForces 295B

/*从要删除最后一个到第一个进行松弛操作,
 因为如果从第一个到最后一个进行松弛操作,弟24行有可能不会更新,若要更新,就需要再一次对d[N][N]初始化
*/


1
#include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long ll; 5 #define N 505 6 //const int inf=1<<30; 7 ll d[N][N],dis[N]; 8 int del[N]; 9 bool v[N];10 int main(){11 int n,i,j,l;12 scanf("%d",&n);13 for(int i=0;i<n;i++){14 for(int j=0;j<n;j++){15 cin>>d[i][j];16 }17 }18 for(i=0;i<n;i++){cin>>del[i];del[i]-=1;}19 for(i=n-1;i>=0;i--){20 v[del[i]]=1;21 ll k=0;22 for(j=0;j<n;j++){23 for(l=0;l<n;l++){24 d[j][l]=min(d[j][l],d[j][del[i]]+d[del[i]][l]);25 }26 }27 for(j=0;j<n;j++){28 for(l=0;l<n;l++){29 if(v[l]&&v[j]){30 k+=d[j][l];31 }32 }33 }34 dis[i]=k;35 }36 for(i=0;i<n-1;i++)cout<<dis[i]<<" ";37 cout<<dis[n-1]<<endl;38 return 0;39 }