最大流应用实验
最大流應用問題
實驗概述
論文評審問題
實驗思路
最大流建圖
論文-評委是一個二分圖,討論的是二分圖的連接問題。以流量的角度來看,我們向每篇論文發放一個容量為a的流量。而評委方每個評委可以承載的流量為b。最后,我們需要將論文方的流量全部發送到評委方。如果流量沒有全部發送完畢,就是一個無解的情況。為了使用最大流的算法,可以在論文方添加一個源點,評委方添加一個匯點。
源點可以看作是發送站,要將a流量發至每一個論文結點。然后論文結點需要想辦法將流量發至評委結點,而每個論文結點和評委結點之間都有一條路,其容量為1,既代表評審一篇論文。專家結點要想辦法將流量發送到匯點,因為那樣才能完成一篇論文的評審。每個專家與匯點的通路的容量為b,既每個專家最多評審b篇論文。b用完后,該專家無法到達匯點(無法完成論文評審)。
最大流求可行解
我們知道最大流問題是求源點到匯點送出的流的最大值。在本問題中,要想把所有論文評審完畢,最大流就必須是m*a。
最后找到所有從評委到論文的邊,這些邊都是原來論文到評委的反向邊,代表經過了這些路徑。
畫出的反向邊就是最后的連線
如果最后發現最大流 < m*a,就沒有解,因為源點送出去的流量沒有全部傳到。本質上是有論文沒有被審批。造成這種現象的原因是論文必須要a個評委,而評委有上限為b篇論文。在網絡中,體現為評委向匯點的路徑不能承受所有傳遞過來的流量。
標出的紅色邊是未送達的流量,說明無解
直接判斷有無解的方法就是看是否am < bn && a < n。如果是就一定有解,既評委向匯點的路徑必能承受所有傳遞來的流量。
最大流算法
現在,問題基本上就解決了,我們可以使用最大流算法來求解了。最大流算法五花八門,大家可以自行百度。其中《算法導論》中的例子是Ford Fulkson (DFS),更好的是EK (Edmons-Karp)算法 (BFS),但不是最好。最好的算法是Dinic,一種BFS分層DFS方法,因為我們的二分圖具有明顯的層次感。我們老師的要求是比較EK和Dinic,當然最好是多實現幾種最大流算法啦。
總結
- 上一篇: 数据库函数依赖及范式
- 下一篇: 【设计模式 01】简单工厂模式(Simp