解説
最小カットの性質
G における最短距離を d(u,v)、頂点 v からの距離和を Dv=∑u=1Nd(v,u) とします。
H の頂点 1,N 間の最小カットの容量は、min(D1,DN) です。
これを示します。
頂点 1 または N だけを切り離せば、容量がそれぞれ D1,DN のカットを作れます。
したがって、任意のカットの容量が min(D1,DN) 以上であることを示せば十分です。
カットを S={1}∪X,T={N}∪Y とし、その容量を C とします。
片側が単独の頂点である場合は明らかなので、p=∣X∣≥1,q=∣Y∣≥1 とします。
X,Y 間の容量の和を R=∑x∈X,y∈Yd(x,y) と置きます。
三角不等式より、各 x∈X,y∈Y について
d(1,x)+d(N,y)≤d(1,y)+d(N,x)+2d(x,y)
です。
これをすべての組について足し、C=d(1,N)+∑y∈Yd(1,y)+∑x∈Xd(N,x)+R を使って整理すると、
qD1+pDN≤(p+q)C−(p+q−2)R≤(p+q)C
となります。
よって C≥min(D1,DN) が成り立ちます。
以降は、min(D1,DN)=K となるグラフを構築します。
必要条件
実現可能な K は、次の範囲に限られます。
ただし、(2N)=N(N−1)/2 とします。
N−1≤K≤(2N)−⌊2N−1⌋またはK=(2N)
下限は、異なる頂点間の距離が 1 以上であることから従います。
上限を示すため、頂点 1,N 間の最短路を一つ取り、その長さを L、最短路の外にある頂点数を r=N−L−1 とします。
最短路上の頂点 v については d(1,v)+d(N,v)=L です。
最短路の外にある頂点 v から最短路までの距離を hv とすると、最短路を経由することで
d(1,v)+d(N,v)≤L+2hv
が成り立ちます。
また、r 個の hv を昇順に並べると、i 番目の値は i 以下です。
距離が h の頂点が存在するには、距離が 1,2,…,h−1 の頂点も必要だからです。
したがって、∑hv≤r(r+1)/2 より
D1+DN≤NL+r(r+1)=N(N−1)−Lr
となります。
r≥1 の場合、L,r≥1 と L+r=N−1 より Lr≥N−2 なので、
min(D1,DN)≤⌊2D1+DN⌋≤(2N)−⌊2N−1⌋
です。
r=0 の場合、最短路が全頂点を通ります。
パス上で隣接しない頂点を結ぶ辺があると最短路が短くなるため、G はパスそのものであり、K=(2N) となります。
構築方法
頂点 1,N を両端とする長さ L のパスを作り、残りの r=N−L−1 頂点を葉としてパスに付けます。
葉 i を頂点 1 から xi 辺進んだ位置に付けると、その葉と頂点 1,N の距離は、それぞれ xi+1,L−xi+1 です。
BL=2L(L+1)+r=N−1+2L(L−1),Q=i=1∑rxi
と置くと、両端からの距離和は
D1=BL+Q,DN=BL+rL−Q
となります。
各 xi は 0 以上 L 以下の任意の整数にできるため、Q は 0 から rL までのすべての整数を取れます。
よって、固定した L で実現できる値は、次の区間です。
BL≤K≤UL,UL=BL+⌊2rL⌋=N−1+⌊2L(N−2)⌋
この構築で、必要条件を満たすすべての K を実現できます。
N≥3 のとき、L=1,…,N−2 に対応する区間の最初の下端と最後の上端は
B1=N−1,UN−2=(2N)−⌊2N−1⌋
です。
また、1≤L≤N−3 では r≥2 なので、
BL+1−UL=L−⌊2Lr⌋≤0
となり、隣り合う区間は重なります。
残る K=(2N) は、L=N−1 としてパスだけを作れば実現できます。
N=2 の場合も、このパスで唯一可能な値 K=1 を実現できます。
実装では、L=1,2,…,N−1 を調べ、BL≤K≤UL を満たすものを一つ選びます。
見つからなければ -1 を出力します。
L が見つかったら、Q=K−BL とし、各葉について xi=min(L,Q)、Q←Q−xi と貪欲に割り当てます。
最初の Q は ⌊rL/2⌋ 以下なので、r 個の葉で必ず割り当てが完了し、構築後は D1=K≤DN となります。
パスの両端に 1,N、ほかの頂点に残りの番号を割り当てれば完成です。
構築するグラフは N 頂点 N−1 辺の木であり、単純かつ連結です。
パスの長さの探索と構築を合わせて、各テストケースの時間計算量は O(N) です。