题意:
给你n个点有向图的邻接矩阵,之后再给你n个数,它一定是1到n的全排列,对于第i个点,求出在删掉这个点以及与这个点相邻的所有边之前,当前剩下所有点两两最短路之和,注意删除操作是持久的,也就是最后整个图一定为空
思路:
水题,倒过来按照删点的顺序floyd就行了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
LL ans[505];
int a[505], flag[505], road[505][505];
int main(void)
{
int n, i, j, k, p;
scanf("%d", &n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%d", &road[i][j]);
}
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
for(p=n;p>=1;p--)
{
k = a[p];
flag[a[p]] = 1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
road[i][j] = min(road[i][j], road[i][k]+road[k][j]);
if(flag[i] && flag[j])
ans[p] += road[i][j];
}
}
}
for(i=1;i<=n;i++)
printf("%lld ", ans[i]);
puts("");
return 0;
}