题意: 给定活动的顺序,某个活动开始之前必须等到前一个活动结束,求出所有活动完成的最早时间
tip:拓扑排序
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
vector<int>checked(n,0);
vector<vector<int>> c(n,vector<int>(n,-1));
for(int i=0; i<m; ++i) {
int s,e,l;
cin>>s>>e>>l;
c[s][e]=l;
checked[e]++;
}
queue<int>s;
for(int i=0; i<n; ++i)
if(!checked[i])
s.push(i);
int count=0,ans=0;
vector<int>spend(n,0);
while(!s.empty()) {
int t=s.front();
count++;
if(spend[t]>ans)
ans=spend[t];
s.pop();
for(int i=0; i<n; ++i)
if(c[t][i]!=-1) {
checked[i]--;
if(spend[i]<spend[t]+c[t][i])//不断更新当前活动最晚完成时间
spend[i]=spend[t]+c[t][i];
if(!checked[i])
s.push(i);
}
}
if(count<n)
cout<<"Impossible\n";
else cout<<ans;
return 0;
}