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;
}
相关文章推荐
- PAT 数据结构 06-图7. How Long Does It Take (25) 拓扑排序 最早开始时间
- 08-图8 How Long Does It Take(25 分)
- 06-4. How Long Does It Take (25)拓扑排序 求关键路径的最长的长度
- 06-图7. How Long Does It Take (25)
- MOOC PTA 08-图8 How Long Does It Take
- 08-图8 How Long Does It Take
- 拓扑排序-图8 How Long Does It Take
- PAT--How Long Does It Take (25)
- 08-图8 How Long Does It Take
- 08-图8 How Long Does It Take
- PAT(MOOC-数据结构) 06-4. How long does it take (25)
- 7-11 How Long Does It Take(25 分)(toposort)
- 陈越何欣铭老师数据结构PTA08-图8 How Long Does It Take
- 08-图8 How Long Does It Take
- 08-图8 How Long Does It Take
- 06-图7. How Long Does It Take (25)
- 06-图7. How Long Does It Take (25)
- 中国大学MOOC-数据结构基础习题集、06-4、How Long Does It Take
- How Long Does It Take
- mooc -- 06-4 How Long Does It Take