1. 程式人生 > >POJ3281 Dining 最大流入門 Dinic演算法

POJ3281 Dining 最大流入門 Dinic演算法

**題意: ** 有N頭牛,F種食物可以製作,D種飲料可以製作 然後每行代表一頭牛的喜好,開頭兩個數fi,di表示這頭牛喜歡fi種食物,di種飲料,接下來fi個數表示喜歡的食物編號,di個數表示喜歡的飲料的編號 現在主人使用最優決策製作出F種食物和D種飲料,問怎麼喂才能使盡可能多的牛餵飽(餵飽=一份食物一份飲料,且一頭牛最多消耗一份食物和一份飲料) , 輸出最多餵飽的牛數 **思路: ** 本題關鍵是建圖,圖建完以後就是裸 dinic 建圖方法: 設1+F+D+2N+1個結點,1表示源點,1+F+D+2N+1表示匯點 * 1+1 ~ 1+F表示食物結點,1+F+1 ~ 1+F+N表示牛的編號,1+F+N+1 ~ 1+F+2N也表示牛的編號,為什麼這樣後面說明 * 1+F+2

N+1 ~ 1+F+2*N+D表示飲料編號 * * 然後被喜歡的食物指向喜歡它的牛的所有邊,牛i指向牛i的所有邊,牛指向它喜歡的飲料的所有邊,源點到所有食物,飲料到所有匯點的邊,權值全設為1 * * 建圖解釋: 首先,這幅圖被分為幾個模組,從左到右依次為:食物製作模組(src-F邊集),餵食物模組(F-N1邊集),牛吃食物模組(N1-N2邊集),喂飲料模組(N2-D邊集)和牛喝飲料模組(D-tar邊集) 然後解釋為什麼設權值為1, 第一:人做的食物和水都是一份;第二:牛最多吃一份食物(水),就算有多份食物指向牛,由於下一條邊(牛指出的邊,即牛吃食物(喝飲料)模組)為1,意味著最後只能流出1的流量,即吃掉其中一份食物,水的指出同理 ,這樣就能想到為什麼要設兩次牛了,就是要通過牛-牛邊控制流量為1,即通過食物選擇模組後,保證一頭牛隻吃了一份食物 , 然後吃完食物流量為1了,就只能選一條路喝飲料,最後飲料流出的也是唯一的一條邊,表示這種飲料最終只能被一頭牛選擇