優先佇列的拓撲排序演算法筆試題

2021-09-26 02:46:45 字數 1636 閱讀 8887

拼多多20屆學霸批演算法筆試題第三題

一共有n個執行的任務,每個任務需要pi的時間完成執行。同時,任務之間可能會有一些依賴關係。比如任務1可能依賴任務2和任務3,那麼任務1必須在任務2和任務3都執行完成後才能執行。

同時只能執行乙個任務,並且在任務完成之前不能暫停切換去執行其他任務。為了提公升平台使用者的使用體驗,希望最小化任務的平均返回時長。乙個任務的返回時長定義為任務執行完成時刻減去平台接收到該任務的時刻。在零時刻,所有n個任務都已經被平台接收。

安排一下任務執行順序,使得平均返回時長最小。

輸入描述:

第一行包含2個正整數n、m,分別表示任務數量以及m個任務依賴關係。

第二行包含n個正整數,第i(1 <= i <= n)個數表示第i個任務的處理時間pi。

接下來的m行,每行表示乙個任務依賴關係。每行包含2個整數ai(1 <= ai <= n)、bi(1 <= bi <= n)。表示第bi個任務依賴於第ai個任務。資料保證不會出現迴圈依賴的情況。

資料範圍:

1 <= n <= 1000

1 <= m <= 50000

1 <= pi <= 10000

輸出描述:

輸出一行,包含n個整數(兩兩之間用乙個空格符分隔),其中第i(1 <= i <= n)個整數表示多多雞執行的第i個任務的編號。若有多種可行方案,則輸出字典序最小(優先執行編號較小的任務)的方案。

示例:輸入:

5 61 2 1 1 1

1 21 3

1 42 5

3 54 5

輸出:1 3 4 2 5

思路:如果不考慮依賴關係,為了實現最小平均返回時長,需要按照耗時越少任務越早執行的順序執行,加上依賴關係後,我們一定要做完依賴任務才能進行依賴後的任務,只有依賴任務的數量為0(表示依賴任務做完,才能進行本任務的執行),這裡的執行順序還是按照處理時間排序;使用小頂堆儲存當前可以執行的任務, 每次出堆後更新依賴次數, 依賴次數為0的任務加入到優先佇列中

c++**:

#include#include#include #include #include #includeusing namespace std;

typedef struct task

}task;

struct cmp

};int main(void)

//輸入任務的依賴關係建立鄰接矩陣

for (int i = 0; i < m; ++i)

//將入度為0的任務放入佇列

priority_queue, cmp> taskque;

for (int i = 1; i < n + 1; ++i)

//進行拓撲排序

vectortasksort;

while (!taskque.empty())

tasksort.push_back(complete.seq);

} //輸出任務順序

for (auto task : tasksort)

cout << endl;

return 0;

}

c++ priority_queue用法(大頂堆,小頂堆)

【c++】stl裡的priority_queue用法總結

拼多多2019學霸批筆試

拓撲排序 利用優先佇列

include include include include using namespace std const int maxn 505 vector graph maxn inttopnum maxn nodenum maxn intnumvertex,numedge 有向無環圖一定存在拓撲序...

優先佇列 stl 拓撲排序

time limit 1 sec memory limit 128 mb submit 169 solved 73 submit status web board 馬上要上體育課了,上體育課之前總歸是要排個隊的,ly作為班長,怎麼排隊的問題只能由她來解決,但是馬上要上課了,ly又不清楚所有人的身高,...

vijos拓撲編號(逆向拓撲排序 優先佇列)

描述h國有n個城市,城市與城市之間有m條單向道路,滿足任何城市不能通過某條路徑回到自己。現在國王想給城市重新編號,令第i個城市的新的編號為a i 滿足所有城市的新的編號都互不相同,並且編號為 1,n 之間的整數。國王認為乙個編號方案是優美的當且僅當對於任意的兩個城市i,j,如果i能夠到達j,那麼a ...