7-34 任務排程的合理性 (25 分)
假定乙個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。「任務排程」包括一組子任務、以及每個子任務可以執行所依賴的子任務集。
比如完成乙個專業的所有課程學習和畢業設計可以看成乙個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英語和c程式設計,它們沒有必須先修哪門的約束;有些課程則不可以同時開設,因為它們有先後的依賴關係,比如c程式設計和資料結構兩門課,必須先學習前者。
但是需要注意的是,對一組子任務,並不是任意的任務排程都是乙個可行的方案。比如方案中存在「子任務a依賴於子任務b,子任務b依賴於子任務c,子任務c又依賴於子任務a」,那麼這三個任務哪個都不能先執行,這就是乙個不可行的方案。你現在的工作是寫程式判定任何乙個給定的任務排程是否可行。
輸入說明:輸入第一行給出子任務數n(≤),子任務按1~n編號。隨後n行,每行給出乙個子任務的依賴集合:首先給出依賴集合中的子任務數k,隨後給出k個子任務編號,整數之間都用空格分隔。
如果方案可行,則輸出1,否則輸出0。
1200
2 1 2
01 4
1 52 3 6
1 32 7 8
1 71 10
1 7
1
5
1 42 1 4
2 2 5
1 30
0
題目分析:一道利用拓撲排序的題 考察的是拓撲排序的定義
1view code#define _crt_secure_no_warnings
2 #include3 #include
4 #include
56 typedef struct enode*edge;
7struct
enode8;
1112 typedef struct gnode*graph;
13struct
gnode14;
1920
int isedge(graph gra, int v1, int
v2)21
2425
void
insert(graph gra, edge e)
2629
30 graph creategraph(int
nv)31
4041
int queue[110
];42
int rear = 0;43
int front = 1;44
int size = 0;45
int succ(int
num)
4652
53int
isempty()
5457
58void enqueue(int
num)
5964
65int
dequeue()
6672
73int indegree[110
];74
int collected[110
];75
intjudget(graph gra)
7687
while (!isempty())
8897}98
for (int i = 1; i <= gra->nv; i++)
99if (!collected[i])
100return0;
101return1;
102}
103int
main()
104119
}120
if(judget(gra))
121 printf("1"
);122
else
123 printf("0"
);124
return0;
125 }
PTA 資料結構與演算法題目集(中文)6 2
6 2 順序表操作集 20 分 本題要求實現順序表的操作集。list makeempty position find list l,elementtype x bool insert list l,elementtype x,position p bool delete list l,positio...
PTA 資料結構與演算法題目集(中文)6 5
6 5 鏈式表操作集 20 分 本題要求實現鏈式表的操作集。position find list l,elementtype x list insert list l,elementtype x,position p list delete list l,position p 其中list結構定義如...
PTA資料結構與演算法題目集(中文)7 18
題意 有兩個視窗a,b,題目給出a視窗處理完兩個顧客,b視窗處理完乙個顧客,並且當不同視窗同時處理完2個顧客時,a視窗顧客優先輸出。我們可以給出兩個佇列q1,q2分別表示a,b視窗,編號為奇數的顧客存放到q1中,為偶數的顧客存放到q2中。include include include include...