7-34 任務排程的合理性 (25 分)
假定乙個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。「任務排程」包括一組子任務、以及每個子任務可以執行所依賴的子任務集。
比如完成乙個專業的所有課程學習和畢業設計可以看成乙個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英語和c程式設計,它們沒有必須先修哪門的約束;有些課程則不可以同時開設,因為它們有先後的依賴關係,比如c程式設計和資料結構兩門課,必須先學習前者。
但是需要注意的是,對一組子任務,並不是任意的任務排程都是乙個可行的方案。比如方案中存在「子任務a依賴於子任務b,子任務b依賴於子任務c,子任務c又依賴於子任務a」,那麼這三個任務哪個都不能先執行,這就是乙個不可行的方案。你現在的工作是寫程式判定任何乙個給定的任務排程是否可行。
輸入格式:
輸入說明:輸入第一行給出子任務數n(≤100),子任務按1~n編號。隨後n行,每行給出乙個子任務的依賴集合:首先給出依賴集合中的子任務數k,隨後給出k個子任務編號,整數之間都用空格分隔。
輸出格式:
如果方案可行,則輸出1,否則輸出0。
輸入樣例1:120
02 1 2
01 4
1 52 3 6
1 32 7 8
1 71 10
1 7輸出樣例1:
1輸入樣例2:
51 4
2 1 4
2 2 5
1 30
輸出樣例2:
0新建乙個存放入度為0的結點佇列q和乙個記錄各結點入度數的陣列in和記錄入隊結點總數的變數sum
將入度為0(in[i] == 0)的結點入隊。
出隊,sum++遍歷出隊結點(設為i)的出度(設為j),令in[j]–(相當於減掉 i->j). 若減掉後in[j] = 0,再將j入隊。
隊列為空(全部入度為0的結點都出隊了),判斷sum與n的關係,若sum < n,則可以認為圖中存在環。因為成環的結點入度數都不為0,不會入隊。
dfs
#include
#include
#define max 105
using namespace std;
int map[max]
[max]
;int vis[max]
;int sign[max]
;int flag, n;
void
dfs(
int x)
else
//結點遍歷過(成環) }}
vis[x]=0
;//回溯
}int
main()
}for
(int i =
0;i < t;i++)}
if(ok) cout<<
1
0
}
拓撲排序
#include
#include
#define max 105
using namespace std;
int map[max]
[max]
;int in[max]
;//in[i] = j表示結點i的入度數 = j
intmain()
}while
(!q.
empty()
)}}if
(num != n) cout<<
0/若存在環,num必定小於n,因為成環的結點入度數不會為0,不會入隊。
else cout<<
1
}
7 34 任務排程的合理性 (25 分)
假定乙個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。任務排程 包括一組子任務 以及每個子任務可以執行所依賴的子任務集。比如完成乙個專業的所有課程學習和畢業設計可以看成乙個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英...
7 34 任務排程的合理性 25 分
假定乙個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。任務排程 包括一組子任務 以及每個子任務可以執行所依賴的子任務集。比如完成乙個專業的所有課程學習和畢業設計可以看成乙個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英...
7 34 任務排程的合理性 25分
假定乙個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。任務排程 包括一組子任務 以及每個子任務可以執行所依賴的子任務集。比如完成乙個專業的所有課程學習和畢業設計可以看成乙個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英...