/*从要删除最后一个到第一个进行松弛操作, 因为如果从第一个到最后一个进行松弛操作,弟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 }
CodeForces 295B
时间: 2024-10-10 07:14:09