contributed by < RusselCK
>
RusselCK
Usage
Using libattopng is as simple as adding both libattopng.h
and libattopng.c
to your project.
編譯
出現錯誤
透過 USB 轉 TTL 序列傳輸線,就可以在不需要螢幕和鍵盤滑鼠的情況下登入 Raspberry Pi
給定 n
個城市,編號為從 1
到 n
,再給予一大小為 n−1
的陣列 edges
,其中 edges[i]=[ui,vi]
表示城市 ui
和 vi
之間存在雙向邊。
題目保證任意城市之間有唯一的路徑,也就是說所城市構成一棵樹 (tree)。
一棵子樹 (subtree) 是上述所有城市的子集,在子集中,任意城市間可透過子集的其他城市和邊到達。
兩個子樹被認為不一樣的條件是,至少有個城市在其中一棵子樹中存在,卻又不存在於另一棵子樹中。
給定 d
範圍介於從 1
到 n−1
,請你找出城市間 最大距離 恰好為 d
的所有子樹數目。
請你回傳一個小為 n−1
的陣列,其中第 d 個元素 (下標從 1 始) 是城市間 最大距離 恰好等於 d
的子樹數目。
兩個城市間 距離 定義是,它們之間需要經過的邊的數目。
d[n][n]
: 任兩個城市的距離
#18
: 距離初始為
實際上只要大於
n-1
即可
d[i][j]
= d[j][i]
,應該可以有更節省空間的方式conn[n]
: 與城市n
相連的 bitmask
#20、21
: (初始) 城市n
必定和自己相連從 edges[]
中得到相連狀況並更新 d[][]
和 conn[]
edges[z]
的內容是 1-indexed,因此需要 -1
改成 0-indexed更新 d[][]
,將 兩步 以上可達的兩個城市的距離記錄下來
d[i][j]
仍為 0xFF
,代表 城市i
無法到達 城市j
,反之亦然rv
: 要回傳的陣列
calloc(n - 1, sizeof(int))
: 配置n - 1
個int
的陣列,並初始為0
int *rv = calloc(n - 1, sizeof(int));
可以改寫成下列形式嗎?參考資料:
窮舉所有的子樹 (bitmask 為 S
)
判斷 S
是否為合法的子樹 ( 即 是否為無環連通圖 )
BFS 非遞迴版本
ctmp
: 目前這層 ( k 步內 ) 可以走訪到的城市conn_nxt
: 下一層 ( (k + 1) 步內 ) 可以走訪到的城市#36
: 將 S
中編號最小的城市當作 root,並納入 ctmp
#39 ~ 41
: 走訪目前這一層可到的城市 (ctmp
),並將下一層可以走訪的城市納入 conn_nxt
#42
: conn_nxt &= S
: 將下一層可走訪的城市先縮在 S
有涵蓋的城市
#43、44
: 若 conn_nxt == ctmp
, 代表已經走訪完所有可走訪的城市,可以跳出 BFS
#45
: 若否,則 conn_nxt
設置成下一層的 ctmp
#47、48
: 若 ~ctmp & S
,代表 S
並非無環連通圖,即不為合法子樹
找出 S
中的最長距離 (ret
),並更新 rv[--ret]
--ret
用意 : 改成 0-indexed