7-3 任務調度的合理性
假定一個工程項目由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。“任務調度”包括一組子任務、以及每個子任務可以執行所依賴的子任務集。
比如完成一個專業的所有課程學習和畢業設計可以看成一個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英語和C程序設計,它們沒有必須先修哪門的約束;有些課程則不可以同時開設,因爲它們有先後的依賴關係,比如C程序設計和數據結構兩門課,必須先學習前者。
但是需要注意的是,對一組子任務,並不是任意的任務調度都是一個可行的方案。比如方案中存在“子任務A依賴於子任務B,子任務B依賴於子任務C,子任務C又依賴於子任務A”,那麼這三個任務哪個都不能先執行,這就是一個不可行的方案。你現在的工作是寫程序判定任何一個給定的任務調度是否可行。
輸入格式:
輸入說明:輸入第一行給出子任務數N(≤100),子任務按1~N編號。隨後N行,每行給出一個子任務的依賴集合:首先給出依賴集合中的子任務數K,隨後給出K個子任務編號,整數之間都用空格分隔。
輸出格式:
如果方案可行,則輸出1,否則輸出0。
輸入樣例1:
12
0
0
2 1 2
0
1 4
1 5
2 3 6
1 3
2 7 8
1 7
1 10
1 7
輸出樣例1:
1
輸入樣例2:
5
1 4
2 1 4
2 2 5
1 3
0
輸出樣例2:
0
完全按思路來,想到哪裏寫到哪裏
首先遍歷每一個vector數組中的元素看是否之前出現過,那麼怎麼判斷是否出現過呢????
這裏用了一個Set集合 存儲出現過得數字
每次遍歷遇到一個沒見過的數字(滿足條件) 就添加到set集合中
最外層的死循環有什麼作用呢???
作用就是:每次遍歷如果沒有新的元素添加到set中就代表,已經飽和,肯定不滿足條件!
就這樣,我也是沒想到能ac
#include"stdio.h"
#include"vector"
#include"set"
using namespace std;
struct jihe{
vector<int> v;
} ;
int book[101]={0};
int main(){
int n;
int cot;
int num;
scanf("%d",&n);
struct jihe ch[n+1];
for(int i=1;i<=n;i++){
scanf("%d",&cot);
while(cot--){
scanf("%d",&num);
ch[i].v.push_back(num);
}
}
set<int> Set;
bool k=true;
bool ll=false;
while(1){
ll=false;
for(int i=1;i<=n;i++){
if(Set.count(i)==1) continue;
k=true;
if(ch[i].v.empty()){
Set.insert(i);
ll=true;
}
else{
for(int j=0;j<ch[i].v.size();j++){
if(Set.count(ch[i].v[j])!=1){
k=false;
break;
}
}
if(k){
Set.insert(i);
ll=true;
}
}
}
if(ll==false) break;
}
for(int k=1;k<=n;k++){
if(Set.count(k)==0){
printf("0");
return 0;
}
}
printf("1");
return 0;
}