7-34 任务调度的合理性 (25 分)(思路加详解+兄弟们冲呀)
一:題目
假定一個(gè)工程項(xiàng)目由一組子任務(wù)構(gòu)成,子任務(wù)之間有的可以并行執(zhí)行,有的必須在完成了其它一些子任務(wù)后才能執(zhí)行。“任務(wù)調(diào)度”包括一組子任務(wù)、以及每個(gè)子任務(wù)可以執(zhí)行所依賴(lài)的子任務(wù)集。
比如完成一個(gè)專(zhuān)業(yè)的所有課程學(xué)習(xí)和畢業(yè)設(shè)計(jì)可以看成一個(gè)本科生要完成的一項(xiàng)工程,各門(mén)課程可以看成是子任務(wù)。有些課程可以同時(shí)開(kāi)設(shè),比如英語(yǔ)和C程序設(shè)計(jì),它們沒(méi)有必須先修哪門(mén)的約束;有些課程則不可以同時(shí)開(kāi)設(shè),因?yàn)樗鼈冇邢群蟮囊蕾?lài)關(guān)系,比如C程序設(shè)計(jì)和數(shù)據(jù)結(jié)構(gòu)兩門(mén)課,必須先學(xué)習(xí)前者。
但是需要注意的是,對(duì)一組子任務(wù),并不是任意的任務(wù)調(diào)度都是一個(gè)可行的方案。比如方案中存在“子任務(wù)A依賴(lài)于子任務(wù)B,子任務(wù)B依賴(lài)于子任務(wù)C,子任務(wù)C又依賴(lài)于子任務(wù)A”,那么這三個(gè)任務(wù)哪個(gè)都不能先執(zhí)行,這就是一個(gè)不可行的方案。你現(xiàn)在的工作是寫(xiě)程序判定任何一個(gè)給定的任務(wù)調(diào)度是否可行。
輸入格式:
輸入說(shuō)明:輸入第一行給出子任務(wù)數(shù)N(≤100),子任務(wù)按1~N編號(hào)。隨后N行,每行給出一個(gè)子任務(wù)的依賴(lài)集合:首先給出依賴(lài)集合中的子任務(wù)數(shù)K,隨后給出K個(gè)子任務(wù)編號(hào),整數(shù)之間都用空格分隔。
輸出格式:
如果方案可行,則輸出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結(jié)尾無(wú)空行
輸出樣例1:
結(jié)尾無(wú)空行
輸入樣例2:
輸出樣例2:
0二:思路分析
這個(gè)題把入度直接給你了,省得去求了,即第一列就是按順序的某個(gè)結(jié)點(diǎn)的入度,如果有環(huán)的話(huà)肯定會(huì)有結(jié)點(diǎn)的入度不會(huì)為0;
三:上碼
//拓?fù)渑判?如果存在環(huán)則不能輸出正常序列 #include<stdio.h> void topology(int N){int i,j,k,m,b[105],count=0;int Indegree[105]={0};//入度初始化為0 int Queue[105],head=0,last=0;int c[105][105];//創(chuàng)建二維數(shù)組 將有到達(dá)這個(gè)頂點(diǎn)的 頂點(diǎn)存進(jìn)去for(i = 1; i<=N; i++){scanf("%d",&k);Indegree[i] = k;//將其入度存進(jìn)去了for(j=0; j<k; j++){scanf("%d",&c[i][j]);}}for(i = 1; i<=N; i++){if(Indegree[i] == 0)Queue[last++]=i;}while(head - last){m = Queue[head++];//出隊(duì) 將入度為0的出隊(duì)count++;//頂點(diǎn)度數(shù)開(kāi)始減一 為0 入隊(duì)for(i=1; i<=N; i++){for(j=0; j<105; j++){if(c[i][j] == m){Indegree[i]--;if(Indegree[i] == 0)Queue[last++] = i;}}}}if(count == N ){printf("1");}elseprintf("0"); } int main(){int N;scanf("%d",&N);topology(N); }四:補(bǔ)充:
如果兄弟們覺(jué)得這道題入度給了,自己不用求,覺(jué)得不過(guò)癮的話(huà),我這還有碼,是求拓?fù)湫蛄?#xff0c;當(dāng)然也能判斷是否有環(huán)和無(wú)環(huán)
/* 1.AOV網(wǎng)(Activity On Vertex Network)【頂點(diǎn)——表示活動(dòng)】是一個(gè)——有向無(wú)回路的圖頂點(diǎn)——表示活動(dòng)用弧——表示活動(dòng)間的優(yōu)先關(guān)系的有向圖稱(chēng)為-頂點(diǎn)表示活動(dòng)的網(wǎng)即如果a->b,那么a是b的先決條件求拓?fù)湫蛄芯褪茿OV2.用鄰接矩陣存儲(chǔ)時(shí) 每一列表示這個(gè)頂點(diǎn)的入度(有向圖中) */ #include<bits/stdc++.h> using namespace std;typedef struct GNode* PtrGraph; typedef struct GNode{int Nv;int Ne;int Date[100][100]; }gnode;int cnt; //統(tǒng)計(jì)每個(gè)結(jié)點(diǎn)的入度 vector<int>v;//存入度的 vector<int>v1;//記錄拓?fù)湫蛄?//創(chuàng)建圖 void creatrGraph(PtrGraph G){int N,M;cin >> N >> M;G->Nv = N;G->Ne = M;//矩陣初始化for( int i = 0; i < G->Nv; i++ ){for(int j = 0; j < G->Nv; j++ ){G->Date[i][j] = 0;}} //矩陣賦值for(int i = 0; i < G->Ne; i++ ){int a,b;cin >> a >> b;G->Date[a][b] = 1;//有向圖 } } //求取每一列的數(shù)據(jù)和即為該頂點(diǎn)的入度 void degree(PtrGraph G){for(int j = 0; j < G->Nv; j++ ){cnt = 0;for( int i = 0; i < G->Nv; i++ ){if(G->Date[i][j] == 1)cnt++;}v.push_back(cnt);} } //求拓?fù)湫蛄?/span>void topology( PtrGraph G ){queue<int>q;int count = 0;//用于計(jì)算度數(shù)為0的結(jié)點(diǎn)的個(gè)數(shù) for( int i = 0; i < G->Nv; i++ ){if(v[i] == 0)q.push(i);//將入度為0的入隊(duì) } //這里就是處理每次去掉一個(gè)度數(shù)為0的點(diǎn)和其有關(guān)系的頂點(diǎn)度數(shù)減一 while( !q.empty() ){int temp = q.front();q.pop();v1.push_back(temp); count++;for( int j = 0; j < G->Nv; j++ ){//列 if( G->Date[temp][j] == 1 ){//在 temp 這一行中 等于 1的 j 需要入度減一 v[j]--;//其入度減一if( v[j] == 0 ){q.push(j);// 將入度為0的入度 }}}} if( G->Nv == count ){//沒(méi)有環(huán) for( int i = 0; i < v1.size(); i++ )cout << v1[i] << ' '; }else{cout << "此圖有環(huán)"; } } int main(){PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));creatrGraph(G);degree(G);topology(G);} //5 6 //0 1 //0 2 //1 3 //2 1 //2 4 //3 4 //拓?fù)湫蛄?#xff1a; 0 2 1 3 4總結(jié)
以上是生活随笔為你收集整理的7-34 任务调度的合理性 (25 分)(思路加详解+兄弟们冲呀)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 洛克王国火焰玻璃怎么得
- 下一篇: java并发练习之快乐影院