#CF295B. Greg and Graph

Greg and Graph

markdown

B. Greg 与图

时间限制:每个测试点 33
内存限制:每个测试点 256256 MB
输入:标准输入
输出:标准输出

Greg 有一个带权有向图,包含 nn 个顶点。在这个图中,任意两个不同顶点之间都有双向的边。Greg 喜欢玩这个图,现在他发明了一个新游戏:

  • 游戏共有 nn 步。
  • 在第 ii 步,Greg 从图中删除编号为 xix_i 的顶点。删除一个顶点时,所有与该顶点相连的入边和出边也会被一并删除。
  • 在执行每一步之前,Greg 想知道当前剩余顶点中所有顶点对之间最短路径长度之和。最短路径可以经过任意剩余顶点。换句话说,假设 d(i,v,u)d(i, v, u) 表示在删除顶点 xix_i 之前形成的图中,顶点 vv 到顶点 uu 的最短路径长度,那么 Greg 想知道以下和式的值:
v<u,v,u 均未被删除d(i,v,u) \sum_{v < u, v, u \text{ 均未被删除}} d(i, v, u)

请帮助 Greg,在每一步之前输出所需的和值。

输入

第一行包含一个整数 nn1n5001 \le n \le 500)—— 图中顶点的数量。

接下来的 nn 行每行包含 nn 个整数 —— 图的邻接矩阵:第 ii 行第 jj 个数 aija_{ij}1aij1051 \le a_{ij} \le 10^5aii=0a_{ii} = 0)表示从顶点 ii 到顶点 jj 的边的权重。

最后一行包含 nn 个互不相同的整数:x1,x2,,xnx_1, x_2, \dots, x_n1xin1 \le x_i \le n)—— Greg 依次删除的顶点编号。

输出

输出 nn 个整数 —— 第 ii 个数等于第 ii 步之前所需的和值。

注意:在 C++ 中,请勿使用 %lld 说明符来读写 64 位整数。建议使用 cincout 流或 %I64d 说明符。

样例

输入样例 1

1
0
1

输出样例 1

0

输入样例 2

2
0 5
4 0
1 2

输出样例 2

9 0

输入样例 3

4
0 3 1 1
6 0 400 1
2 4 0 1
1 1 1 0
4 1 2 3

输出样例 3

17 23 404 0