題意:
假定乙個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。「任務排程」包括一組子任務、以及每個子任務可以執行所依賴的子任務集。
比如完成乙個專業的所有課程學習和畢業設計可以看成乙個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英語和c程式設計,它們沒有必須先修哪門的約束;有些課程則不可以同時開設,因為它們有先後的依賴關係,比如c程式設計和資料結構兩門課,必須先學習前者。
但是需要注意的是,對一組子任務,並不是任意的任務排程都是乙個可行的方案。比如方案中存在「子任務a依賴於子任務b,子任務b依賴於子任務c,子任務c又依賴於子任務a」,那麼這三個任務哪個都不能先執行,這就是乙個不可行的方案。你現在的工作是寫程式判定任何乙個給定的任務排程是否可行。
輸入說明:輸入第一行給出子任務數n(
≤100
),子任務按1~
n編號。隨後
n行,每行給出乙個子任務的依賴集合:首先給出依賴集合中的子任務數
k,隨後給出
k個子任務編號,整數之間都用空格分隔。
如果方案可行,則輸出1,否則輸出0。
思路: 拓撲排序主要是判斷圖中有無環問題。首先對各頂點的入度進行分析。入度為0的進棧。然後對棧內元素進行分析:棧每彈出頂點,就得連同它指向的節點途徑也刪去(所指向的節點它的入度數量減1) 。之後判斷更新後的頂點入度情況 ,入度為0的繼續入棧。
注意: 棧中每退出乙個節點,記錄數加1。最終記錄數結果等於節點總數。則拓撲成功,反之亦然。
**:
/*
@拓撲排序:任務排程的合理性
*/#include#include#include#define max_num 100
using namespace std;
int indegree[max_num];
vectoradj[max_num];
void topologicalsort(int n)
}stackq;
for(int i = 1;i<=n;i++)
}int count = 0;
while(!q.empty())
}
測試結果: pta 任務排程合理性
拓撲排序,三重迴圈,在pta上一般不會超時,不過,為了以防萬一,可以在找到入度為零的點之後先把指標存起來,再另外寫乙個迴圈,再去刪除他的後續任務的度,這樣就是兩個雙重迴圈,而不是三重迴圈,可以大大節約時間,三重迴圈 如下 5 34 任務排程的合理性 25分 假定乙個工程專案由一組子任務構成,子任務之...
pat 任務排程的合理性 拓撲排序
拓撲排序概念 在乙個有向圖中,對所有的節點進行排序,要求沒有乙個節點指向它前面的節點。過程 先統計所有節點的入度,對於入度為0的節點就可以分離出來,然後把這個節點指向的節點的入度 1。重複此過程直至所有節點都被分離出來。ps 如果最後不存在入度為0的節點,那就說明有環,不存在拓撲排序,也就是很多題目...
PTA 7 34 任務排程的合理性 拓撲排序
7 34 任務排程的合理性 25 分 假定乙個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。任務排程 包括一組子任務 以及每個子任務可以執行所依賴的子任務集。比如完成乙個專業的所有課程學習和畢業設計可以看成乙個本科生要完成的一項工程,各門課程可以看成...