题目:
08-图8 How Long Does It Take (25分)
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
NN
N
(
≤100\le 100
≤
1
0
0
), the number of activity check points (hence it is assumed that the check points are numbered from 0 to
N−1N-1
N
−
1
), and
MM
M
, the number of activities. Then
MM
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>
#include<string.h>
#include<math.h>
#define MaxN 100+10
typedef struct line *queue;
int indegree[MaxN]={0};
int maxtime[MaxN];
int symbol[MaxN]={0};
struct act
{
int *outact;
int *outtime;
int now;
}a[MaxN];
struct line
{
int star;
int end;
int *Element;
};
//
queue CreateQ(int Size)
{
queue q;
q=(queue)malloc(sizeof(struct line));
q->star=0;
q->end=0;
q->Element=(int *)malloc(sizeof(int)*(Size+1));
return q;
}
void InsertQ(int X,queue q)
{
q->Element[q->end++]=X;
}
int DeleteQ(queue q)
{
return q->Element[q->star++];
}
int IsEmptyQ(queue q)
{
return q->star==q->end;
}
//
void Initialize(int N)
{
int i;
for(i=0;i<=N;i++)
{
a[i].now=0;
a[i].outact=(int *)malloc(sizeof(int)*(N+1));
a[i].outtime=(int *)malloc(sizeof(int)*(N+1));
}
}
int main()
{
int N,M;
queue q;
memset(maxtime,0,sizeof(maxtime));
scanf("%d%d",&N,&M);
Initialize(N);
q=CreateQ(N);
int i;
for(i=1;i<=M;i++)
{
int star,end,time;
scanf("%d%d%d",&star,&end,&time);
a[star].outact[a[star].now]=end;
a[star].outtime[a[star].now++]=time;
indegree[end]++;
}
for(i=0;i<N;i++)
if(indegree[i]==0)
{
InsertQ(i,q);
symbol[i]=1;
}
int cnt=0;
int X=-1;
while(!IsEmptyQ(q))
{
X=DeleteQ(q);
cnt++;
for(i=0;i<a[X].now;i++)
{
indegree[a[X].outact[i]]--;
if(indegree[a[X].outact[i]]==0)
InsertQ(a[X].outact[i],q);
if(maxtime[a[X].outact[i]]<maxtime[X]+a[X].outtime[i])
maxtime[a[X].outact[i]]=maxtime[X]+a[X].outtime[i];
}
}
if(cnt!=N)
printf("Impossible");
else
{
int max=-1;
for(i=0;i<N;i++)
if(maxtime[i]>max)
max=maxtime[i];
printf("%d",max);
}
return 0;
}