您的位置:首页 > 其它

08-图8 How Long Does It Take(25 point(s)) 拓扑排序

2017-11-21 10:55 841 查看


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 
4000
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: