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

来源:互联网 发布:mac翻墙浏览器 编辑:程序博客网 时间:2024/05/22 06:16


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 N1), 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 120 1 60 2 40 3 51 4 12 4 13 5 25 4 04 6 94 7 75 7 46 8 27 8 4

Sample Output 1:

18

Sample Input 2:

4 50 1 10 2 22 1 31 3 43 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;}



原创粉丝点击