1. 程式人生 > >洛谷P1113 雜務

洛谷P1113 雜務

i++ pri front 最短 標記 輸入輸出格式 序號 文件中 足夠

題目描述

John的農場在給奶牛擠奶前有很多雜務要完成,每一項雜務都需要一定的時間來完成它。比如:他們要將奶牛集合起來,將他們趕進牛棚,為奶牛清洗乳房以及一些其它工作。盡早將所有雜務完成是必要的,因為這樣才有更多時間擠出更多的牛奶。當然,有些雜務必須在另一些雜務完成的情況下才能進行。比如:只有將奶牛趕進牛棚才能開始為它清洗乳房,還有在未給奶牛清洗乳房之前不能擠奶。我們把這些工作稱為完成本項工作的準備工作。至少有一項雜務不要求有準備工作,這個可以最早著手完成的工作,標記為雜務1。John有需要完成的n個雜務的清單,並且這份清單是有一定順序的,雜務k(k>1)的準備工作只可能在雜務1..k-1中。

寫一個程序從1到n讀入每個雜務的工作說明。計算出所有雜務都被完成的最短時間。當然互相沒有關系的雜務可以同時工作,並且,你可以假定John的農場有足夠多的工人來同時完成任意多項任務。

輸入輸出格式

輸入格式:

1行:一個整數n,必須完成的雜務的數目(3<=n<=10,000);

2 ~ n+1行: 共有n行,每行有一些用1個空格隔開的整數,分別表示:

工作序號(1..n,在輸入文件中是有序的);

完成工作所需要的時間len(1<=len<=100);

一些必須完成的準備工作,總數不超過100個,由一個數字0結束。有些雜務沒有需要準備的工作只描述一個單獨的0,整個輸入文件中不會出現多余的空格。

輸出格式:

一個整數,表示完成所有雜務所需的最短時間。

輸入輸出樣例

輸入樣例#1:

7

1 5 0

2 2 1 0

3 3 2 0

4 6 1 0

5 1 2 4 0

6 8 2 4 0

7 4 3 5 6 0

輸出樣例#1:

23

拓撲排序。
保證全部完成任務,所以要求出到達這個點的最大時間。

 1 #include<cstdio>
 2 #include<queue>
 3 #include<iostream>
 4 using namespace std;
 5 const int maxn=10050;
 6 
 7
int n,t[maxn],f[maxn][50],t1,mainmax,max1; 8 9 bool bo[maxn],boo[maxn]; 10 11 queue <int> q; 12 13 int main() 14 { 15 int d1,d2; 16 17 scanf("%d",&n); 18 19 for(int i=1;i<=n;i++) 20 { 21 d2=1; 22 scanf("%d%d",&d1,&t1); 23 t[d1]=t1; 24 while(d2!=0) 25 { 26 scanf("%d",&d2); 27 if(d2!=0) 28 { 29 f[d1][++f[d1][0]]=d2; 30 } 31 } 32 if(f[d1][0]==0) 33 { 34 bo[d1]=1; 35 continue; 36 } 37 q.push(d1); 38 boo[d1]=1; 39 40 } 41 while(!q.empty()) 42 { 43 int tt=q.front(); 44 45 q.pop(); 46 boo[tt]=0; 47 48 bool jud=0; 49 for(int i=1;i<=f[tt][0];i++) 50 { 51 if(!bo[f[tt][i]]) 52 { 53 jud=1; 54 if(!boo[f[tt][i]]) 55 { 56 q.push(f[tt][i]); 57 boo[f[tt][i]]=0; 58 } 59 60 } 61 62 63 } 64 65 if(!jud) 66 { 67 max1=0; 68 bo[tt]=1; 69 for(int i=1;i<=f[tt][0];i++) 70 max1=max(max1,t[f[tt][i]]); 71 t[tt]+=max1; 72 } 73 } 74 75 for(int i=1;i<=n;i++) 76 mainmax=max(mainmax,t[i]); 77 printf("%d",mainmax); 78 return 0; 79 }

洛谷P1113 雜務