PAT How Long Does It Take (25) (拓扑排序)

来源:互联网 发布:电脑管家mac版 编辑:程序博客网 时间:2024/05/01 02:17

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 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<bits/stdc++.h>using namespace std;const int maxn = 105;int n, m, k, head[maxn];struct node{int u, v, w, next;}edge[maxn];struct node2{int degree, early;}G[maxn];void addEdge(int u, int v, int w){edge[k].v = v;edge[k].w = w;edge[k].next = head[u];head[u] = k++;}void topSort(){queue<int> q;int count = 0;for(int i = 0; i < n; i++)if(G[i].degree == 0)q.push(i), count++;while(!q.empty()){int u = q.front(); q.pop();for(int t = head[u]; t != -1; t = edge[t].next){int to = edge[t].v;int curEar = G[u].early;int nextEar = G[to].early;int cost = edge[t].w;G[to].early = max(nextEar, curEar+cost);if(--G[to].degree == 0)q.push(to), count++;}}if(count != n) puts("Impossible");else{int ans = -1;for(int i = 0; i < n; i++)ans = max(ans, G[i].early);printf("%d\n", ans);}}int main(void){while(cin >> n >> m){memset(G, 0, sizeof(G));memset(head, -1, sizeof(head));k = 0;while(m--){int u, v, w;scanf("%d%d%d", &u, &v, &w);G[v].degree++;addEdge(u, v, w);}topSort();}return 0;}


0 0