题目解析
- 一个项目由若干个任务组成,任务之间有先后依赖顺序。
-
- 项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务。
-
- 里程碑是指:指向里程碑的任务全部完成,才能继续里程碑指向的任务。
- 现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。
代码:
#include <bits/stdc++.h>
using namespace std;
int dis[105][105], ru[105], f[105];
int n, ans, cnt = 0;
void Tsort(){
while(1){
int flag=1;
for(int i=0;i<n;i++){
if(!ru[i]){//if(ru[i]==0)
ru[i]--;
cnt++;
flag=0;
for(int j=0;j<n;j++){
if(dis[i][j]!=-1){
ru[j]--;
f[j]=max(f[j],f[i]+dis[i][j]);//里程碑的需要指向里程碑的任务全部完成,故需要时间最长的路径
ans=max(f[j],ans);//如果能完成工程,总时间最长的那条路径,一定遍历全部结点的路径
}
}
}
}
if(flag==1) break;
}
if(cnt==n) cout<<ans<<endl;
else cout<<"Impossible"<<endl;
}
int main()
{
int m;
cin >> n >> m;
memset(dis, -1, sizeof dis);
while (m--)
{
int p, x, y;
cin >> x >> y >> p;
dis[x][y] = p;
ru[y]++;
}
Tsort();
return 0;
}