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
理解分析题意:这是一个AOE网络
但是这个是以AOE网络的工程项目排序关键路径问题为背景,实际上还是拓扑排序的简单变形
#include<iostream>
#include<vector>
#include<string>
#include<deque>
using namespace std;
class node {
public:
int V;
int T;
node(int v, int t) {
V = v; T = t;
}
};
int main() {
int N, M; cin >> N >> M;
int m = M;
vector<vector<node>>Graph(N);
vector<int>indegree(N,0);
vector<int>earliest(N,-1);
deque<int>zero;
while (m--) {
int s,e,l;
cin >> s >> e >> l;
Graph[s].emplace_back( node(e, l));
indegree[e]++;
}
for (int i = 0; i < N; i++)
if (indegree[i] == 0) {
zero.emplace_back(i);
earliest[i] = 0;
}
while (!zero.empty()) {
int tem = zero.front(); zero.pop_front();
for (auto n : Graph[tem]) {
earliest[n.V] = max(earliest[n.V], earliest[tem] + n.T);
indegree[n.V]--;
if (indegree[n.V] == 0)zero.emplace_back(n.V);
}
}
int time = 0; int i = 0;
for (; i < N; i++) {
if (earliest[i] == -1)break;
time = max(earliest[i], time);
}
if (i == N )cout << time;
else cout << "Impossible";
}