题目链接:https://www.luogu.org/problem/P1522
思路:编号,然后跑floyd,这是很清楚的。然后记录每个点在这个联通块中的最远距离。
然后分连通块,枚举两个点(不属于同一个连通块的)建边,计算可能的直径 dist[i] + dist[j] + dis(i,j)。
当然,这里有一个需要注意,(sccno[x]表示属于哪一个编号的连通块,sccdis[x]表示该连通块的直径),
在枚举点建边,形成新的牧场,得到新的可能的直径时,dist[i] + dist[j] + dis(i,j) >= max(sccdis[sccno[i]],sccdis[sccno[j]]),
这个是一定要成立的,因为新的可能的直径不可能小于sccdis[sccno[i]] 和 sccdis[sccno[j]](结合题目意思)。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include