每天一个TopCoder算法题(16.08.17)

这个题目来自TopCoder SRM692 250分的题目

原题

每天一个TopCoder算法题(16.08.17)_第1张图片
srm692_250.png

题意:

现在有一个图,图上面有一些点,第i点跟第j点的距离为dist[i][j]。现在我们可以去掉一些边,让这个图仍然是强联通图。并且图中最大的边与最小的边差距最小。
这个图的点的个数2 <= n <= 50
提示:强联通图中的任意两点都可以互相到达。

Key1:

解决这种求某个区间最大或者最小的问题,我们通常可以采用枚举区间的方法,即枚举区间的左边界与右边界来解决问题。
当我们确定区间之后,我们就能去掉图中不在这个区间的边,然后判断是否为强联通。

Key2:

求区间的题目,区间的左右边界一般是题目给定的某些数据。
例如在这个题目中,区间的左右边界一定是某条边!(这个显而易见,如果有一条边为11,右边界11跟11.5都可以用到这条边,很明显11更优。)

思考:

这个题目首先要考虑的是如何判断一个图是强联通图,这里我们先讲一种暴力的解决方法。
枚举每一个点,判断这个点能否到达图中的其它点。 时间复杂度(NxN)
我们枚举左右边界,总共有50x50=2500条边,那么复杂度为50x50x50x50,加上上面的判断,总复杂度为50^6 = 1.5 x 10^10。
我们来探讨有没有更优的解决方法,我们将边的大小从小到大排序后,我们发现了这么一个特殊的性质。

每天一个TopCoder算法题(16.08.17)_第2张图片
692.jpg

假如当左边界确定为L1的时候,右边界为R1可以找到一个合法的解,那么,无需再找下一个右边界!(想一想为什么)
那么,当左边界变为L2时,右边界R2的位置一定>=R1.(假设R'小于R1,因为[L1,R']无解,所以[L2,R']无解)也就是存在单调性!
在这个的基础上,我们不再需要去用两个for枚举左右边界了。可以把复杂度降到 O(50^4)。

总结

在一些区间问题上,需要用多个for去枚举,我们应该用心观察,看看是否有单调的性质!可以进行降维!

你可能感兴趣的:(每天一个TopCoder算法题(16.08.17))