7-34 任務排程的合理性 (25 分)
阿新 • • 發佈:2018-11-01
假定一個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。“任務排程”包括一組子任務、以及每個子任務可以執行所依賴的子任務集。
比如完成一個專業的所有課程學習和畢業設計可以看成一個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英語和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
#include <bits/stdc++.h>
using namespace std;
int a[ 101][101]={0};
int vis[101]={0};
int main()
{
int n,m,t=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i][0];
for(int j=1;j<=a[i][0];j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if( !a[j][0]){
vis[j]=1;
}
else {
int f=1;
for(int k=1;k<=a[j][0];k++){
if(!vis[a[j][k]])f=0;
}
if(f==1)vis[j]=1;
}
}
}
for(int i=1;i<=n;i++){
if(!vis[i])t=0;
}
if(t==1)cout<<1<<endl;
else cout<<0<<endl;
}