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
#include <cstdio>
#include <algorithm>
#include <queue>
#define MAX 1000
#define INF 0x3fffffff
using namespace std;
int N, M;
int MGraph[MAX][MAX];
int indegree[MAX] = { 0 };
int TopOrder[MAX] = { 0 };
int dist[MAX] = { 0 };
void initMGraph() {
for( int i = 0; i < MAX; i++ )
for( int j = 0; j < MAX; j++ ) {
if( i == j ) MGraph[i][j] = 0;
else MGraph[i][j] = INF;
}
}
void insertEdge( int a, int b, int w ) {
MGraph[a][b] = w;
}
bool TopSort() {
for( int i = 0; i < N; i++ )
for( int j = 0; j < N; j++ ) {
if( MGraph[i][j] != INF && MGraph[i][j] != 0 ) {
indegree[j]++;
}
}
queue<int> q;
int cnt = 0;
for( int i = 0; i < N; i++ ) {
if( indegree[i] == 0 ) {
q.push( i );
cnt++;
}
}
while( !q.empty() ) {
int curNode = q.front();
q.pop();
TopOrder[cnt] = curNode;
for( int i = 0; i < N; i++ ) {
if( MGraph[curNode][i] != INF && MGraph[curNode][i] != 0 ) {
indegree[i]--;
dist[i] = max( dist[curNode] + MGraph[curNode][i], dist[i] );
if( indegree[i] == 0 ) {
q.push( i );
cnt++;
}
}
}
}
//printf( "%d\n", cnt );
//for( int i = 0; i < N; i++ ) printf( "%d\n", dist[i] );
if( cnt != N ) return false;
return true;
}
int main() {
//freopen( "123.txt", "r", stdin );
initMGraph();
scanf( "%d%d", &N, &M );
int a, b, w;
for( int i = 0; i < M; i++ ) {
scanf( "%d%d%d", &a, &b, &w );
insertEdge( a, b, w );
}
bool flag = TopSort();
if( flag ) {
int max = dist[0];
for( int i = 0; i < N; i++ ) {
if( dist[i] > max ) {
max = dist[i];
}
}
printf( "%d\n", max );
}
else {
printf( "Impossible\n" );
}
return 0;
}