P1119 灾后重建
P1119 灾后重建
题目背景
B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。
题目描述
给出 B 地区的村庄数
输入格式
第一行包含两个正整数
第二行包含
接下来
接下来一行也就是
接下来
输出格式
共
输入输出样例 #1
输入 #1
4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4
输出 #1
-1
-1
5
4
说明/提示
- 对于
的数据,有 ; - 对于
的数据,有 ,其中有 的数据有 且 ; - 对于
的数据,有 ; - 对于
的数据,有 , , ,所有输入数据涉及整数均不超过 。
思路
图最短路问题,但是图会随时间更新,而且每次问询的源点跟终点不同,需要多次使用最短路的算法,但是如果每次都使用,会相当耗时
村庄相当于图中的点,所以每次完成重建相当于在图中添加了点和线路,并且这里是无向图,源点到终点等于终点到源点,每次添加新点时,可以计算新点到其他点的最短路,如果新点对已经存在的最短路有影响,那么一定要经过新点,而经过新点的最短路,一定是新点到源点和终点最短路的和。
可以按照上面的思路建立时间-最短路表,统计每个时间点下的最短路,然后每次问询时都可以通过查表解决
按照上面的思路编写代码,
void upgrade(int t_index, int st)
{
// 更新,添加新的村庄
// 前面先调用dijkstra找到st到各点最短路
auto &dist_d = dist[t_index];
// int now_t = ts[t_index];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < i; j++)
{
if (dist_d[i][j] > dist_d[st][i] + dist_d[st][j])
{
dist_d[i][j] = dist_d[st][i] + dist_d[st][j];
dist_d[j][i] = dist_d[i][j];
}
}
}
}提交,30分,不过还好,都是WA,没出现超时,证明思路基本可以
