Re: [問題] ACM UVa10160 Servicing Station
看板Prob_Solve (計算數學 Problem Solving)作者DJWS (...)時間14年前 (2010/10/14 18:00)推噓0(0推 0噓 0→)留言0則, 0人參與討論串4/5 (看更多)
抱歉回文回得有點慢...
我用的方法是backtracking
窮舉n個0/1數字的所有排列
(類似於窮舉所有子集合)
遞迴過程當中
甲、隨時計算目前被服務到的城市有哪些
乙、也隨時判斷目前的排列是不是合理的
丙、也隨時紀錄目前的最佳解!可以做bound!
因為這題的n值有點大
所以我用了一些小技巧來避免TLE
一、
紀錄地圖的資料結構
我用的是adjacency lists
這樣可以節省一點時間
二、
紀錄城市有被/沒被服務
我用了一個類似於counting sort的陣列
如果城市x有被服務到 就count[x]++;
如果城市沒被服務到就不加加
這樣可以節省一點時間
程式碼也會變得很優雅
三、
一開始我先把每個城市都放上服務站
把count[x]統統累加好
執行回溯法的時候
則是使用消去/不消去服務站兩種選擇
這樣子倒行逆施有一個好處
就是每當發現有一個城市沒有被服務到(count[x] <= 0)
馬上就可以剪枝!
四、
我用了一個bound
當遞迴到第m層時
第1~m的城市共留有c個服務站
此時
如果把m+1~n的服務站全部去掉之後
發現沒有比最佳解好到哪裡去(c - (n-m) >= ans)
就算繼續遞迴下去也沒意義
馬上就可以bound!
(這個不是A*喔...就是branch and bound的bound!)
我用的方法大致上是這樣
如果有需要我再寄程式碼給你,不用客氣!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.115.153.221
※ 編輯: DJWS 來自: 59.115.153.221 (10/14 18:04)
※ 編輯: DJWS 來自: 59.115.153.221 (10/14 18:05)
※ 編輯: DJWS 來自: 59.115.153.221 (10/14 18:11)
※ 編輯: DJWS 來自: 59.115.153.221 (10/14 18:16)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 4 之 5 篇):
Prob_Solve 近期熱門文章
PTT數位生活區 即時熱門文章