06-图7. How Long Does It Take (25)
Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project.
Input Specification:
Each input file contains one test case. Each case starts with a line containing two positive integers N (<=100), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N-1), and M, the number of activities. Then M lines follow, each gives the description of an activity. For the i-th activity, three non-negative numbers are given: S[i], E[i], and L[i], where S[i] is the index of the starting check point, E[i] of the ending check point, and L[i] the lasting time of the activity. The numbers in a line are separated by a space.
Output Specification:
For each test case, if the scheduling is possible, print in a line its earliest completion time; or simply output "Impossible".
Sample Input 1:9 12 0 1 6 0 2 4 0 3 5 1 4 1 2 4 1 3 5 2 5 4 0 4 6 9 4 7 7 5 7 4 6 8 2 7 8 4Sample Output 1:
18Sample Input 2:
4 5 0 1 1 0 2 2 2 1 3 1 3 4 3 2 5Sample Output 2:
Impossible
AOV图。拓扑排序。
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<queue> 6 #include<vector> 7 #include<cmath> 8 #include<string> 9 using namespace std; 10 int Map[105][105],dist[105],indegree[105]; 11 int main(){ 12 //freopen("D:\INPUT.txt","r",stdin); 13 int n,m; 14 int i,j,a,b,cost; 15 scanf("%d %d",&n,&m); 16 for(i=0;i<n;i++){ 17 dist[i]=-1; 18 indegree[i]=0; 19 for(j=0;j<n;j++){ 20 Map[i][j]=Map[j][i]=-1; 21 } 22 } 23 for(i=0;i<m;i++){ 24 scanf("%d %d %d",&a,&b,&cost); 25 Map[a][b]=cost; 26 indegree[b]++; 27 } 28 queue<int> q; 29 for(i=0;i<n;i++){ 30 if(!indegree[i]){ 31 q.push(i); 32 dist[i]=0;//这个初始化很重要 33 } 34 } 35 int cur; 36 while(!q.empty()){ 37 cur=q.front(); 38 q.pop(); 39 for(i=0;i<n;i++){ 40 if(Map[cur][i]!=-1){ 41 indegree[i]--; 42 if(dist[cur]+Map[cur][i]>dist[i]){ 43 dist[i]=dist[cur]+Map[cur][i]; 44 } 45 if(!indegree[i]){ 46 q.push(i); 47 } 48 } 49 } 50 } 51 int maxcost=-1; 52 for(i=0;i<n;i++){ 53 if(indegree[i]){ 54 break; 55 } 56 if(dist[i]>maxcost){ 57 maxcost=dist[i]; 58 } 59 } 60 if(i==n){ 61 printf("%d ",maxcost); 62 } 63 else{ 64 printf("Impossible "); 65 } 66 return 0; 67 }