#HT1035. 删点后最短路之和

删点后最短路之和

题目描述

有一个包含 nn 个节点的有向完全图,图中节点编号从 11nn。初始时任意两点间都存在着两条反向的有向边。接下来你需要对这个有向图进行 nn 步操作:

  • ii 步操作,你需要从图中删除编号为 xix_i 的点;与此同时,图中所有与 xix_i 点相连的边也将会被删除。
  • 在每一步删除节点前,你需要统计图中所有目前还存在的点之间的最短路径长度之和。换句话说,如果我们定义 d(i,v,u)d(i, v, u) 表示第 ii 步操作(即删除 xix_i 节点)之前从 vvuu 的最短路径长度,则你需要求解的是 v,u,vud(i,v,u)\sum\limits_{v,u,v \neq u} d(i, v, u)

请计算每一步(删除 xix_i 之前)对应的最短路径长度之和。

输入格式

输入的第一行包含一个整数 n(1n500)n(1 \le n \le 500),表示图中节点个数。

接下来 nn 行,每行包含 nn 个整数,其中第 ii 的第 jj 个整数表示从节点 ii 连向节点 jj 的有向边的长度 ai,j(1ai,j105,ai,i=0)a_{i,j}(1 \le a_{i,j} \le 10^5, a_{i,i} = 0)

接下来一行包含 nn 个各不相同的整数 x1,x2,xn(1xin)x_1, x_2, \ldots x_n(1 \le x_i \le n),两两之间以一个空格分隔,分别表示每一步要删除的点。

输出格式

输出共一行,包含 nn 个整数,两两之间以一个空格分隔,其中第 ii 个整数表示第 ii 步操作(删除 xix_i 节点)之前图中所有节点的最短路径长度之和。

样例

1
0
1
0
2
0 5
4 0
1 2
9 0 
4
0 3 1 1
6 0 400 1
2 4 0 1
1 1 1 0
4 1 2 3
17 23 404 0 

数据范围

  • 对于 20%20\% 的数据,n10,ai,j10n \le 10, a_{i,j} \le 10
  • 对于 50%50\% 的数据,n100n \le 100
  • 对于 100%100\% 的数据,1n500,1ai,j1051 \le n \le 500, 1 \le a_{i,j} \le 10^5