AtCoder Beginner Contest 416 - E - Development 题解
题意简析
给你一个 \(N\) 个节点 \(M\) 条边的无向图,边有边权。
有 \(K\) 个机场,其中任意两个相连都有一条边权为 \(T\) 的边。
\(Q\) 次操作:
- 加一条边。
- 将某个点变为机场。
- 询问所有节点对的路径的最短路径和。
思路解析
题目要我们维护一个动态图,最特殊的是有两种边:普通的边和机场。
显然机场更为特殊,如何处理呢?
要我们输出答案的是操作 3。
对于每个操作 3,计算所有城市对 \((i,j)\) 的最小路径时,考虑两种可能:
-
只通过公路,维护为 \(dis[i][j]\)。
-
通过机场:从 \(i\) 到最近机场,机场间转移,再到 \(j\),维护为 \(air\_dis[i] + T + air\_dis[j]\),其中 \(air\_dis\) 表示各点经由普通公路到机场的最短距离。
就要维护两个数组,\(dis\) 和 \(air\_dis\)。
再看剩下的两个操作。
对于每个操作 1:
-
更新 \(dis\):用新边松弛所有城市对的最短路径。
-
重新计算每个城市的 \(air\_dis\)。
对于每个操作 2:
-
将城市加入机场集合。
-
更新该城市的机场距离为 \(0\),更新其他城市的机场距离。
时间复杂度
初始化:Floyd,\(O(N^3)\)。
每次操作:
-
\(O(N^2)\) 用于更新 \(dis\),重新计算 \(air\_dis\)。
-
\(O(N)\) 更新 \(air\_dis\)。
-
\(O(N^2)\) 计算所有城市对的最短路径和。
总复杂度 \(O(N^3 + QN^2)\),由于 \(N \le 500\) 且 \(Q \le 1000\),加上 Atcoder 的神机,可以通过此题。
后记
- 同一对城市之间可以建多条道路,同一城市也可以建多个机场。
- 十年 OI 一场空,不开
long long
见祖宗。 还是挺暴力的。