工程
张三是某工程公司的项目工程师。一天公司接下一项大型工程,该公司在大型工程的施工前,先要把整个工程划分为若干个子工程,并把这些子工程编号为1、2、…、N;这样划分之后,子工程之间就会有一些依赖关系,即一些子工程必须在某些子工程完成之后才能施工,公司需要工程师张三计算整个工程最少的完成时间。
对于上面问题,可以假设:
1、根据预算,每一个子工程都有一个完成时间。
2、子工程之间的依赖关系是:部分子工程必须在一些子工程完成之后才开工。
3、只要满足子工程间的依赖关系,在任何时刻可以有任何多个子工程同时在施工,也即同时施工的子工程个数不受限制。
例如:有五个子工程的工程规划表:
现在对于给定的子工程规划情况,及每个子工程完成所需的时间,如果子工程划分合理则求出完成整个工程最少要用的时间,如果子工程划分不合理,则输出-1。
样例输入:
5
5 4 12 7 2
0 0 0 0
0 0 0 0
0 0 0 0
1 1 0 0
1 1 1 1
样例输出:
14
思路
拓扑经典题,求得入度为0的点后进行拓扑排序
设当前工程i的最早结束时间为ti[i],所需时间为we[i],则工程i的最早结束时间为所有能到达i的点中最早结束时间的最大值(因为工程i必须等到所有它依赖的工程结束才能开始,因此工程i至少要等到结束时间最晚的那个工程结束后才能开始)再加上工程i自身所需时间,即:
t i [ i ] = m a x ( t i [ i ] , t i [ p ] + w e [ i ] ) ti[i]=max(ti[i],ti[p]+we[i]) ti[i]=max(t