2011-04-18 33 views
3

有些學生希望通過向每個n講座發送最少的學生人數來儘量減少他們的講座出席率。計算參加系列講座的學生的最低人數

  • 講座i開始於時間a[i]和時間結束b[i]
  • 它需要r[i][j]時間從講座i通勤講學j

是否有任何的算法來計算所需要的學生的最小數量參加所有講座?

+1

「最小流量下限」是什麼意思? – 2011-04-18 06:12:24

+2

弄糊塗了?有什麼困惑呢?告訴我們你有多瞭解它,呃?就像「起初我認爲這只是最大的重疊問題,但後來我意識到,因爲學生們在非授課時間之間移動,所以我認爲這個想法打破了。任何方式來挽救它?「...如果你甚至不能開始考慮它,你有什麼機會了解解決方案? – bdares 2011-04-18 07:01:14

+0

http://en.wikipedia.org/wiki/Flow_network – Andrey 2011-04-18 08:01:08

回答

1

將類視爲圖中的節點。如果可以及時從講座i到講座j,則在圖中的節點對(i,j)之間構建邊緣。圖的「根」節點是當天的第一類(在任何其他類到達該類之前結束的類)。

第一個關鍵的觀察是該圖是有向和無環的(你不能回到過去)。

您的目標是找到通過圖的路徑的最小數量,以便每個節點至少訪問一次。這立即導致了第二個關鍵的觀察,這是可以貪婪地完成的。

所以算法進行如下:

  1. 發現在向無環圖的最長路徑(DAG)
  2. 取下圖
  3. 增量minNumStudents
  4. 在路徑中找到的節點重複直到圖形沒有更多節點

查找DAG中最長的路徑很簡單納克動態規劃:

  1. 計算圖表
  2. 保持陣列的topological orderorderingdistV元素(節點的圖中的編號),初始化爲0
  3. 保持陣列prevV元件,將前一個節點存儲在路徑中

Then

for each vertex `V` in `ordering` 
    for each edge (V,W) 
     dist[W] = min(dist[W],dist[V]+1) 
     prev[W] = V; 

您最長的路徑在W處結束,因此dist[W]是最大值。最長的路徑可以使用prev陣列通過從W回溯來計算。