Re: [問題] ACM UVa10160 Servicing Station

看板Prob_Solve (計算數學 Problem Solving)作者 (...)時間14年前 (2010/10/14 18:00), 編輯推噓0(000)
留言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)
文章代碼(AID): #1CjjJGw7 (Prob_Solve)
文章代碼(AID): #1CjjJGw7 (Prob_Solve)