題意
給你\(2 \times n\)個點分成了\(A\)和\(B\)兩個部分,其中\(A\)和\(B\)中都有\(n\)個點,開始的時候有一些邊連接了\(A\)中的一些點和\(B\)中的一些點,你每一次可以加一條邊,這條邊的兩端分別是\(A\)和\(B\)中的一個點,並且\(A\)與\(B\)之前並不直接相連,現在想讓你求出最少要加幾條邊,才能滿足
1.任意從\(A\)中和\(B\)中選擇一對點,這個點對互相之間是聯通的
2.任意從\(A\)中和\(B\)中選擇一對點,這個點對之間的最長路嚴格大於\(n\)
分析
首先考慮\(m=0\),也就是只給你\(2n\)個點的時候應該怎么構造連邊方案,我們發現我們要滿足這\(2n\)個點之間相互聯通,那么最少要連接\(2 \times n - 1\)條邊,也就是連成一棵樹,但是我們還要滿足任意點對之間的最長路大於\(n\),因為我們發現我們只能在兩個集合之間連邊,那么如果只連成一棵樹,那么必定存在一條邊的兩端,這條邊兩端的點的最長路為\(1\),所以要考慮再加邊. 我們發現對於這條邊的兩個端點,如果他們兩個點到各自不經過這條邊能到達的最遠點之間能連接一條邊,那么這兩個點之間的最長路就會從\(1\)變得盡可能長,而且這兩個最遠點連邊之后必然會形成一個環,我們發現在形成一個環之后,如果有不在環上的點,那么必然會造成路徑距離的浪費,所以最優情況就是所有的\(2n\)個點都在環上.那么這\(2n\)個點,我們任選一對點,這一對點之間會有兩條路徑,我們記路徑長度為別為\(a\)和\(b\),那么一定會有\(a+b=2n\),邊數為\(2n-1\),那么最長路一定大於\(n\)。
然后考慮\(m \not= 0\)的情況,發現保證沒有重邊和自環的情況,那么就相當於在\(m=0\)的情況時提前給你連好了幾條邊,我們只需要維護度數小於\(2\)的點然后考慮怎么連邊即可.
心得
構造題還是一直不知道怎么分析,感覺看的太整體了也不是很好,這道題就要從\(m=0\)的特例開始想起然后才能發現這道構造題所需要的性質,其實還是自己做題做少了嗚嗚