08-图8 How Long Does It Take(25 point(s))
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
同时用邻接表和邻接矩阵存储,两个邻接表同时存储进来的和出去的,另外一个数组incnt实时记录每个节点的入度
#include<cstdio>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
list<int>zeroin;
vector<int>inn[100],outt[100];
int n,m,mp[100][100],e[100],incnt[100];
int main(){
fill(e,e+100,-1);
scanf("%d %d",&n,&m);
int i,te,ts,tl;
for(i=0;i<m;i++){
scanf("%d %d %d",&ts,&te,&tl);
mp[ts][te]=tl;
inn[te].push_back(ts);
outt[ts].push_back(te);
incnt[te]++;
}
for(i=0;i<n;i++){
if(inn[i].size()==0){
zeroin.push_back(i);
}
}
while(!zeroin.empty()){
int now=zeroin.front();
zeroin.pop_front();
if(inn[now].size()==0){
e[now]=0;
}
else{
int maxt=-1;
for(i=0;i<inn[now].size();i++){
if(e[inn[now][i]]+mp[inn[now][i]][now]>maxt){
maxt=e[inn[now][i]]+mp[inn[now][i]][now];
}
}
e[now]=maxt;
}
for(i=0;i<outt[now].size();i++){
incnt[outt[now][i]]--;
if(incnt[outt[now][i]]==0){
zeroin.push_back(outt[now][i]);
}
}
}
bool f=true;
int maxt=-1;
for(i=0;i<n;i++){
if(e[i]==-1){
f=false;break;
}
if(e[i]>maxt) maxt=e[i];
}
if(f){
printf("%d",maxt);
}
else{
printf("Impossible");
}
return 0;
}