跳到主要内容

大阪大学 情報科学研究科 情報数理学専攻 2017年7月実施 情報数理学 情報基礎

Author

祭音Myyura (co-authored with GPT 5.6 SOL)

Description

1

任意の相異なる2頂点がただ一つの有向辺で結ばれる有向グラフをトーナメントという。有向辺に沿って全頂点を1度ずつ通る路をハミルトン路という。

(1) 次のトーナメントのハミルトン路をすべて、頂点番号の列で示せ。

(2) 頂点数が NN 未満の任意のトーナメントにハミルトン路があると仮定し、頂点数 NN の場合にも存在することを示せ。

2

文字集合 AA の文字からなる、長さ MM の文字列 U=u1uMU=u_1\cdots u_M と長さ NN の文字列 V=v1vNV=v_1\cdots v_N を考える。長さ0は空文字列とする。挿入は 0kM0\le k\le M の位置に AA の1文字を加える操作、削除と置換は M>0M>0 のとき 1kM1\le k\le M の文字をそれぞれ除く、または AA の1文字へ置き換える操作である。

距離 d(U,V)d(U,V) を、これらを繰り返して UUVV にする最小操作回数とする。0mM0\le m\le M, 0nN0\le n\le N に対して Um=u1umU_m=u_1\cdots u_m, Vn=v1vnV_n=v_1\cdots v_n とし、添字0は空文字列を表す。

(1) d(U0,Vn)d(U_0,V_n)d(Um,V0)d(U_m,V_0) を求めよ。

(2) m,n1m,n\ge1 のとき、d(Um,Vn)d(U_m,V_n)d(Um1,Vn)d(U_{m-1},V_n), d(Um,Vn1)d(U_m,V_{n-1}), d(Um1,Vn1)d(U_{m-1},V_{n-1})um,vnu_m,v_n から計算できることを説明せよ。

(3) d(U,V)d(U,V) を求めるアルゴリズムと時間計算量を、理由とともに示せ。

3

NN 個のノード 1,,N1,\ldots,N の各々が、次のノード番号 next(i){1,,N}\operatorname{next}(i)\in\{1,\ldots,N\} を保持する。x0=1x_0=1, xk+1=next(xk)x_{k+1}=\operatorname{next}(x_k) とする。

(1) xm=xm+nx_m=x_{m+n} となる m0,n>0m\ge0,n>0 が存在し、そのとき任意の kmk\ge m について xk=xk+nx_k=x_{k+n} であることを示せ。

(2) 次のアルゴリズムが必ず停止することを示せ。

p ← next(1)
q ← next(next(1))
while p ≠ q do
p ← next(p)
q ← next(next(q))
end while

Kai

1

(1) 頂点4に入る辺がないので、4は必ず先頭である。残りの頂点の順序を調べると、全ハミルトン路は

(4,1,3,5,2), (4,2,1,3,5), (4,2,3,5,1), (4,3,5,2,1), (4,5,2,1,3).\boxed{(4,1,3,5,2),\ (4,2,1,3,5),\ (4,2,3,5,1),\ (4,3,5,2,1),\ (4,5,2,1,3)}.

(2) 1頂点 vv を除いたトーナメントには、帰納法の仮定よりハミルトン路 v1vN1v_1\to\cdots\to v_{N-1} がある。 vviv\to v_i となる最初の添字 ii が存在すれば、i=1i=1 のとき先頭に、i>1i>1 のとき vi1v_{i-1}viv_i の間に vv を挿入する。後者では最小性より vi1vv_{i-1}\to v である。そのような ii がなければ vN1vv_{N-1}\to v なので末尾に加える。いずれも全頂点を通る路が得られる。

2

(1) 長さを変えるのに必要な回数より

d(U0,Vn)=n,d(Um,V0)=m.d(U_0,V_n)=n,\qquad d(U_m,V_0)=m.

(2) Dm,n=d(Um,Vn)D_{m,n}=d(U_m,V_n), δm,n=0\delta_{m,n}=0um=vnu_m=v_n), 11umvnu_m\ne v_n)とおく。最適な文字対応の末尾は、削除・挿入・一致または置換のいずれかであるから

Dm,n=min{Dm1,n+1, Dm,n1+1, Dm1,n1+δm,n}.\boxed{D_{m,n}=\min\{D_{m-1,n}+1,\ D_{m,n-1}+1,\ D_{m-1,n-1}+\delta_{m,n}\}}.

各候補は実際の操作列で達成でき、どの対応もいずれかに分類されるので、この最小値は必要十分である。

(3) 第0行・第0列を(1)で初期化し、m=1,,Mm=1,\ldots,M, n=1,,Nn=1,\ldots,N の順に(2)で表を埋めて DM,ND_{M,N} を返す。各要素の計算は定数時間なので、時間計算量は O(MN+M+N)\boxed{O(MN+M+N)}M,N1M,N\ge1 なら O(MN)O(MN))。必要記憶量は表全体で O(MN)O(MN)、直前の行だけ保存すれば O(min(M,N)+1)O(\min(M,N)+1) にできる。

3

(1) x0,,xNx_0,\ldots,x_NN+1N+1 個だが値は NN 種類なので、鳩の巣原理より xm=xm+nx_m=x_{m+n} となる 0m<m+nN0\le m<m+n\le N がある。両辺に next\operatorname{next} を繰り返し適用すれば、任意の kmk\ge mxk=xk+nx_k=x_{k+n} を得る。

(2) 初期化後と各反復後のポインタは、ある整数 t1t\ge1 に対して p=xtp=x_t, q=x2tq=x_{2t} である。tmt\ge m かつ ntn\mid t となる tt を選ぶと、(1)の周期性から xt=x2tx_t=x_{2t}。したがって、それ以前に停止していなければこの時点で停止する。