切換
舊版
前往
大廳
主題

ZeroJudge - b062: 1. 城市道路連通網 解題心得

Not In My Back Yard | 2019-04-23 21:27:13 | 巴幣 2 | 人氣 242

題目連結:


題目大意:
給定一正整數 m (1 < m ≦ 32),代表有 m 座城市,編號分別為 1 ~ m。接著的 m 列輸入,每列有 m 個為「0」、「1」的字元,代表城市之間的道路連通情形。設某個「1」在第 r 列第 c 行,則第 r 個與第 c 個城市有道路相通。

接著的三列輸入,給定了三個正整數 i 、 j 、 N (i ≠ j,1 ≦ i 、 j ≦ m , 1 ≦ N ≦ 50)。假設每條道路的長度為 1 公里,則試問:從編號 i 城市到編號 j 的所有方法之中,總公里數 < N 的有多少種?



範例輸入:
5
01000
10001
00011
00101
01110
3
5
3
7
0101000
1011000
0100000
1100110
0001010
0001101
0000010
1
7
5


範例輸出:
6
11


解題思維:
本題可以運用動態規劃(Dynamic Programming)的思維解決。

定義一二維陣列 DP[x][y],代表從起點(編號 i 的城市)走到 x 城市總共走了 y 公里的方法數。因此根據定義,我們可以得知 DP[i][0] = 1 (因為就是在起點,所以不用動就到了),其他的部分先設為 0 。

接著窮舉 y 的值,從 1 ~ N 跑過一次。每次跑的時候,就掃過一次給定的城市連通關係圖,當遇到城市 a 與城市 b 連通的時候,則
DP[a][y] = DP[a][y] + DP[b][y - 1]
也就是說,每一次窮舉 y 之值時,其實就是在慢慢地從起點擴張出去(一次走一公里一公里地走,因此也可以使用廣度優先搜尋(BFS,Breadth First Search)完成此問題)。

最後, DP[j][1] + DP[j][2] + …… DP[j][N] 即是所求的總方法數。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

eric920906
此題BFS不能解ㄛ!你一定沒試過就上來寫解題報告
2021-06-23 02:01:07
Not In My Back Yard
可否說明一下為何不可行呢?(這是我兩年前解的,我需要一點時間或提示思考)
2021-06-23 02:09:35
Not In My Back Yard
測試了一下,DFS 和 BFS 都可解喔。不過你需要額外記錄過你跑過的狀態(當前城市 & 當前公里數),重複跑到相同的狀態會導致超時或是記憶體超出限制。

DFS 程式碼:
https://www.codepile.net/pile/W70a3NEM
BFS 程式碼:
https://www.codepile.net/pile/pzA1KMzx
2021-06-23 02:54:43
Not In My Back Yard
其實 BFS 的部分跟 DP 解兩者的核心基本上差不多啦,只是長得不太一樣、跑法(經過的狀態之順序)也不太一樣的樣子。
2021-06-23 03:00:22

更多創作