[討論] UVa12615

看板Prob_Solve (計算數學 Problem Solving)作者 (大笨蛋小月唷!)時間10年前 (2015/01/15 03:37), 編輯推噓8(8013)
留言21則, 4人參與, 最新討論串1/4 (看更多)
想試著和大家討論看看題目 >_< http://uva.onlinejudge.org/external/126/12615.html 這題是這樣的,有一個Graph,每條邊都有cost 它滿足四個條件: 1. 此圖為連通圖 2. 每個點degree至多6 3. 此圖上若有cycle,則cycle大小一定為3,且任兩個cycle沒有共用的點 4. 所有cycle上的點degree至多4 題目要你找出一個cost總和最小的邊集,滿足所有不此邊集的邊都至少與一條邊集裡的邊 相鄰,回答最小cost即可。 嗯...喜歡玩全自己想題目的可以先看到這裡...接下來我要說我目前的做法 不過我自己覺得我的方法很複雜,想問問看大家有沒有想到什麼精妙的做法 ======= 這題我的直覺就是想到在Tree上做dp 但是我設計的dp在每個點上各有9個state,每次從子節點返回時進行狀態轉移,至多有 9*9*2*2種組合,有點多且挺複雜的 首先要注意到,根據題目條件,用dfs走訪所有點後每個非root的點的back edge至多一條 ,且距離恰為2,所以每個點連出去的邊至多只會影響比它稍微靠進root的兩個祖先 接著,dp過程中,每個點我們都可用三種狀態去表示,分別是: 0:普通的點 1:尚未與任何一條邊集裡的邊相連且與至少一條不滿足條件的邊相連 2:已至少和一條邊集裡的邊相連 由於每個點連的邊至多影響兩個祖先的點,所在dp時可只記錄當前點與父節點的所有狀態 組合,共3*3種 真正的dp過程寫成psedocode會是以下這樣: dp[x][state1][state2] := 只考慮點x的子樹下所有當前已拜訪的邊和點的back edge時, 已知x點的狀態是state1,已及x點的父親的狀態是state2時的最佳解 dfs(x): dp[x][i][j] := 0 when i = j = 0 dp[x][i][j] := INF otherwise 對於所有與x相鄰且尚未拜訪過的y: dfs(y) 把tmp[3][3] 初使化為一個值全為 INF的陣列 for i1 from 0 to 2: //i1,j1,i2,j2是枚舉所有點x和y的dp狀態 for j1 from 0 to 2: for i2 from 0 to 2: for j2 from 0 to 2: for s1 from 0 to 1: //s1=1代表邊(x,y)在邊集裡 for s2 from 0 to 1://s2=1代表y有back edge且該邊在邊集 令st1,st2為根據枚舉的條件得到的x點的新的狀態(過程省略...) 若 tmp[st1][st2] > dp[x][i1][j1] + dp[y][i2][j2] + s1*(邊(x,y)的cost) + s2*(y的back edge cost): 更新tmp[st1][st2]質為右式 把tmp陣列複至給dp[x]陣列 dfs end 可以任意點r當root呼叫dfs(r),最後的答案會是min(dp[r][0][0],dp[r][2][0]) 這過程真的非常複雜,由其轉移的部分很容易就想錯... 有沒有人有更好的想法呢>_<? 此方法必須對在圖上做dfs後邊的可能位置有所了解,可以參考wiki http://en.wikipedia.org/wiki/Depth-first_search#Output_of_a_depth-first_search -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.233.216 ※ 文章網址: https://www.ptt.cc/bbs/Prob_Solve/M.1421264240.A.D1E.html

01/15 05:21, , 1F
題目要求是不是要找一個maximal matching?
01/15 05:21, 1F

01/15 07:55, , 2F
01/15 07:55, 2F

01/15 07:58, , 3F
看起來是 edge dominating set
01/15 07:58, 3F

01/15 07:58, , 4F
maximal matching 是 edge indepenent set
01/15 07:58, 4F

01/15 08:01, , 5F
independent
01/15 08:01, 5F

01/15 19:49, , 6F
ICPC台灣參賽者交流社根本沒人在討論題目...
01/15 19:49, 6F

01/15 19:50, , 7F
資訊競賽選手新手村到是第一次看到
01/15 19:50, 7F

01/15 19:53, , 8F
若把邊當點,大概可以應轉成一般圖的最大獨立集
01/15 19:53, 8F

01/15 19:54, , 9F
而且每條邊至多和六條邊相鄰
01/15 19:54, 9F

01/15 19:54, , 10F
這樣才真的有用到題目條件
01/15 19:54, 10F

01/15 19:55, , 11F
新手村的成員都太年輕了0.0
01/15 19:55, 11F

01/15 21:44, , 12F
你的作法是不是tree decomposition?
01/15 21:44, 12F

01/15 21:48, , 13F
這個圖的tree width看起來好像只有2..
01/15 21:48, 13F

01/15 22:17, , 14F
若把邊當點,是最小支配集。它不等於最大獨立集。
01/15 22:17, 14F

01/15 22:21, , 15F
抱歉說錯名詞
01/15 22:21, 15F

01/15 22:40, , 16F
查了一下什麼是tree decomposition,看來我的做法確實
01/15 22:40, 16F

01/15 22:40, , 17F
是這個東西
01/15 22:40, 17F

01/15 22:41, , 18F
一般圖最小支配集能做嘛?
01/15 22:41, 18F

01/15 22:46, , 19F
minimum dominating set是NPC..
01/15 22:46, 19F

01/29 12:19, , 20F
感覺上在這個圖的BFS Tree作DP會不會比較簡單?
01/29 12:19, 20F

01/29 12:19, , 21F
呃 不會 當我沒說 =口=
01/29 12:19, 21F
文章代碼(AID): #1KjiLmqU (Prob_Solve)
討論串 (同標題文章)
以下文章回應了本文
3
8
完整討論串 (本文為第 1 之 4 篇):
8
21
3
8
文章代碼(AID): #1KjiLmqU (Prob_Solve)