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 (≤), 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<stdio.h>
#include<stdlib.h>
#define MaxSize 10000
typedef struct Node {
int El;
int La;
}Nodes;
int main() {
int n,m;
scanf("%d %d", &n, &m);
int DEEP[101] = { 0 }; //保存点的度数
int sort[101] = { 0 }; //保存排序结果
int a[101][101] = { 0 }; //保存路径长度
int start[100];
Nodes *N = (Nodes *)malloc(sizeof(Nodes)*n);
for (int i = 0; i < n; i++)
{
start[i] = -1;
N[i].El = 0;
N[i].La = MaxSize;
for (int j = 0; j < n; j++)
{
a[i][j] = -1;
}
}
int qi, zhong, chang;
for (int j = 0; j < m; j++)
{
scanf("%d %d %d", &qi, &zhong, &chang);
a[qi][zhong] = chang;
DEEP[zhong]++;
}
int ss = 0,flag=0;
for (int i = 0; i < n; i++)
{
flag = -1;
for (int j = 0; j < n; j++)
{
if (DEEP[j] == 0) {
flag = 0;
DEEP[j] = -1;
sort[ss] = j;
ss++;
for (int k = 0; k < n; k++)
{
if (a[j][k] != -1) {
DEEP[k]--;
}
}
break;
}
}
if (flag == -1) {
break;
}
}
if (flag == 0) {
int max = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (a[j][sort[i]] != -1) {
if (N[sort[i]].El < N[j].El + a[j][sort[i]]) {
N[sort[i]].El = a[j][sort[i]] + N[j].El;
}
}
}
}
for (int i = 0; i < n; i++)
{
if (N[i].El > max) {
max = N[i].El;
}
}
printf("%d",max);
}
else {
printf("Impossible");
}
return 0;
}