CF295B Greg and Graph
题目传送门:CF295B
这道题是练习 的好题。
首先我们来思考一下,删除 次点,每次删点求一次最短路,用 做则是 也就是 的复杂度,会 飞,于是我们考虑从后往前,每次删点当作加点即可。优化后复杂度 ,可以过。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 505;
int n;
int dis[N][N], del[N], ans[N];
bool f[N];
void floyd()
{
for (int p = n; p >= 1; p--)
{
int k = del[p];
f[k] = true;
int sum = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i != j)
{
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
if (f[i] && f[j])
{
sum += dis[i][j];
}
}
}
}
ans[p] = sum;
}
}
void print()
{
for (int i = 1; i <= n; i++)
{
cout << ans[i] << " ";
}
cout << "\n";
}
void input()
{
cin >> n;
memset(dis, 0x3f, sizeof(dis));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int w;
cin >> w;
dis[i][j] = w;
}
}
for (int i = 1; i <= n; i++)
{
cin >> del[i];
}
}
signed main()
{
input();
floyd();
print();
return 0;
}

浙公网安备 33010602011771号