08-图8 How Long Does It Take

来源:互联网 发布:mac好用的绘图 编辑:程序博客网 时间:2024/06/06 00:40

7-12 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 N1), 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 120 1 60 2 40 3 51 4 12 4 13 5 25 4 04 6 94 7 75 7 46 8 27 8 4

Sample Output 1:

18

Sample Input 2:

4 50 1 10 2 22 1 31 3 43 2 5

Sample Output 2:

Impossible


#include<iostream>#include<queue>using namespace std;const int maxn=105,infinity=10000;int N,M,minTime[maxn] = {0},InDegree[maxn] = {0},TopNum[maxn] = {0},G[maxn][maxn] = {0};void ToplogicSort(){    int v,mark = 1,cnt = 0;    queue<int>q;    for(int i=0;i<N;i++){        if(!InDegree[i]){            q.push(i);            cnt++;        }    }    while(!q.empty()){        v = q.front();        TopNum[cnt] = v;        q.pop();        for(int i=0;i<N;i++){            if(G[v][i] < infinity){                InDegree[i]--;                minTime[i] = max(minTime[v] + G[v][i],minTime[i]);                if(!InDegree[i]){                    q.push(i);                    cnt++;                }            }        }    }    int maxT = 0;    if(cnt != N) cout<<"Impossible"<<endl;    else{        for(int i=0;i<N;i++){            if(minTime[i] > maxT) maxT = minTime[i];        }        cout<<maxT<<endl;    }}int main(){    int a,b,l;    cin>>N>>M;    for(int i=0;i<N;i++){        for(int j=0;j<N;j++){            G[i][j] = infinity;        }    }    for(int i=0;i<M;i++){        cin>>a>>b>>l;        InDegree[b]++;        G[a][b] = l;    }    ToplogicSort();    return 0;}


原创粉丝点击