06-图7. How Long Does It Take (25)

来源:互联网 发布:a5域名交易 编辑:程序博客网 时间:2024/06/10 08:06

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 4
Sample Output 1:
18
Sample Input 2:
4 5
0 1 1
0 2 2
2 1 3
1 3 4
3 2 5
Sample Output 2:
Impossible

此题对拓扑排序改变一下即可,用类似 dijkstra的方法做

#include<cstdio>#include<iostream>#include<queue>#define INF -1//#define LOCALusing namespace std;int G[105][105];int ToplogicalSort(int N,int* Dist);void GetInDegree(int* InDegree,int N);int Max(int* Dist ,int N);int main(){#ifdef LOCAL    freopen("data.in","r",stdin);    freopen("data.out","w",stdout);#endif    int N,M;    cin >> N >> M;    int i,j;    for(i = 0;i<N;i++)        for(j = 0;j<N;j++)            G[i][j] = INF;    int x,y,c;    for(i = 0;i<M;i++){        cin >> x >> y >> c;        G[x][y] = c;    }    int Dist[N];    int k = ToplogicalSort(N,Dist);    if(!k)        cout << "Impossible";    else        cout << k;    return 0;}int Max(int* Dist ,int N){    int max = -1;    int i;    for(i = 0;i<N;i++)        if(Dist[i]>max)            max = Dist[i];    return max;}int ToplogicalSort(int N,int* Dist){    queue<int>Q;    int Counter = 0;    int i,j;    for(int i = 0;i<N;i++)        Dist[i] = 0;        int InDegree[N];//  取得入度     GetInDegree(InDegree,N);    for(i = 0;i<N;i++)        if(!InDegree[i])            Q.push(i);    while(!Q.empty()){        j = Q.front();        Q.pop();        Counter++;        for(i = 0;i<N;i++)            if(G[j][i] > INF){                InDegree[i] -- ;                Dist[i] = max(Dist[i],Dist[j] + G[j][i]);//类似dijkstra                 if(!InDegree[i])                    Q.push(i);             }    }    if(Counter != N)        return 0;    else         return Max(Dist,N);}void GetInDegree(int* InDegree,int N){    int cnt = 0;    int i,j;    for(i = 0;i<N;i++,cnt = 0){        for(j = 0;j<N;j++){            if(G[j][i] > INF)                cnt++;        }        InDegree[i] = cnt;    }}
0 0