被教練安排講題 可惡
這道題我是十月初上課時花了一下午作出來的,當時連倍增都不會,過程比較困難,如今看看還能夠
原本想口胡一發,後來想了想可能之後要用,仍是寫成文章吧算法
求一棵嚴格次小生成樹的權值和ip
次小生成樹,分爲嚴格和不嚴格兩種io
把不嚴格的次小生成樹中權值與最小生成樹相同的除去,剩下那個的就是嚴格次小生成樹統計
因此考慮如何除去非嚴格部分就好了數據
既然要求次小生成樹樹嚴格小,那就能夠維護一個最大值和一個次大值,保證次大值嚴格小於最大值時間
算法方面,使用 Kruskal 和 倍增生成
預先 DFS 處理這棵樹的點深度,每一個點的父親,最大值和次大值的初始值script
再使用倍增求出每一個點所能到達的最大值和次大值枚舉
而後找出一顆最小生成樹,統計它的權值和,並對於每條處於最小生成樹中的邊打一個標記文章
對於每條不在最小生成樹中的邊,找出與它相對的處於最小生成樹中的最大的一條邊,刪去,而後一邊跳一邊枚舉路徑上的邊權
而後判斷當前枚舉邊與刪去邊的權值大小,若相同加入當前邊的次大值,不然加入最大值,而後統計權值
最後把統計出的全部權值取一個最小值就是嚴格次小生成樹的權值
想將一條非樹邊加入生成樹中,就必須刪去它的始點終點到公共祖先路徑上的一條邊,不然就會構成環
想要使得生成的生成樹嚴格小且儘量小,就必須使得刪去的那條樹邊儘量大
對於每條枚舉邊,它的權值一定大於等於刪去邊,爲了不次小生成樹不嚴格,當等於時就只能加入其次大值,不然加入其最大值
對於全部邊都進行此處理,得出權值和最小的一定是嚴格且最小的生成樹
如此 本題便獲得解決
本題比較噁心,不要讀完數據直接建圖,不然會爆
肯定好生成樹後,只建出一顆最小生成樹便可
另外代碼就不放了,到如今時間比較長了,寫的也比較醜
但願各位看懂了