题意:现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。(项目里程碑的数量 N(≤100)和任务总数 M。这里的里程碑从 0 到 N−1 编号。随后 M行,每行给出一项任务的描述,格式为“任务起始里程碑 任务结束里程碑 工作时长”,三个数字均为非负整数,以空格分隔。)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,m,deg[N],d[N],vs[N];
struct nd{
int v,w;
};
vector<nd> e[N];
int main() {
cin>>n>>m;
for(int i=1;i<=m;i++) {
int u,v,w;
cin>>u>>v>>w;
e[u].push_back({v,w});
deg[v]++;
}
queue<int> q;
for(int i=0;i<n;i++)
if(deg[i]==0) q.push(i),vs[i]=1;
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=0;i<e[u].size();i++) {
nd to=e[u][i];
deg[to.v]--;
if(!deg[to.v]) vs[to.v]=1,q.push(to.v);
d[to.v]=max(d[to.v],d[u]+to.w);
}
}
for(int i=0;i<n;i++) {
if(!vs[i]) {
cout<<"Impossible"<<endl;
return 0;
}
}
int ans=0;
for(int i=0;i<n;i++) ans=max(ans,d[i]);
cout<<ans<<endl;
return 0;
}