# 台大 106 軟體 ###### tags: `NTU` `106` `軟體` 1. (a) O(lgn) (b) O(n) \(c\) O(n) (d) lgnlglgn 2. (a) yes (b) no, 372 不該出現在 355 的右子樹 \(c\) yes 3. 3A: len[i-1,j-1]+1, 3B:A,prev,i-1,j-1, 3C:A[i] 4. 令 G=(V,E),其中 $V=\{v_1,v_2,v_3,...,v_n\}$ 為所有城市的集合,E 為所有城市間的有向邊的集合。 (a) 令 $V'=\bigcup_{i=1}^{n}\{v_i^{in},v_i^{out}\}$ 令 $E'=\bigcup_{i=1}^{n}\{(v_j^{out},v_i^{in})\ |\ (v_j,v_i)\in E\}\ \cup\ \{(v_i^{out},v_k^{in})\ |\ (v_i,v_k)\in E\}\ \cup\ \{(v_i^{in},v_i^{out})\}$ 令 $r((v_i^{in},v_i^{out}))=c(v)$ 令 capital 為 $v_1$,以 $v_1^{in}$ 為起點,對 G'=(V',E') 做 Dijkstra 演算,每個 $v_i^{out}$ 的最短路徑,即為題目要求之 $M(v_i)$ (b) 分析: 此題需考慮每個點的權重,是最短路徑問題的變形。 只需把「點的權重」轉化為「邊的權重」,即可用最短路徑演算法求解。 做法是將每個點 $v$ 分割成兩個點: $v_{in}$ 與 $v_{out}$。將所有 $v$ 的入邊與 $v_{in}$ 連接,將所有出邊 與 $v_{out}$ 連接。然後在 $v_{in}$ 與 $v_{out}$ 間建一條邊,令其權重為 $v$ 的點權重 $c(v)$。 時間複雜度: O(ClgC + R) 5. (a) 令 $L=$ 所有課程的集合,$R=$ 所有教室的集合。令 $V=L\ \cup\ R\ \cup\ \{s,t\}$ $E=\{(c_i,r_j)\ |\ c_i\in L,r_j\in R,(c_i,r_j)\in M\}\ \cup\ \{(s,c_i)\ |\ c_i\in L\}\ \cup\ \{(r_j,t)\ |\ r_j\in R\}$ 令 $c:E\rightarrow R$ 為容量函數。令 $c(s,c_i)=c(r_j,t)=1,\ \forall c_i\in L,\forall r_j\in R$,$c(c_i,r_j)=\infty,\ \forall c_i\in L,\ r_j\in R,\ (c_i,r_j)\in E$ 對 $G=(V,E,c)$ 求最大流,即為題目所求 (b)