比赛的时候没有把题目读清楚 导致这么简单的一道拓扑排序没做 属实有点遗憾
跑一遍拓扑排序 最后统计每个任务如果有没法执行的就impossible
否则就输出所有任务花费时间最长的那个
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=105;
int n,m,ans;
int in[maxn],out[maxn];
int dp[maxn],vis[maxn];
queue<int>q;
vector<int>Q[maxn],W[maxn];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int uu,vv,cc;
cin>>uu>>vv>>cc;
Q[uu].push_back(vv);
W[uu].push_back(cc);
in[vv]++;out[uu]++;
vis[vv]=1;
}
for(int i=0;i<n;i++)
if(!in[i])q.push(i);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<Q[u].size();i++){
int to=Q[u][i],w=W[u][i];
dp[to]=max(dp[to],dp[u]+w);
ans=max(dp[to],ans);
in[to]--;
if(!in[to])q.push(to);
}
}
for(int i=0;i<n;i++)
if(vis[i]&&!dp[i]){
cout<<"Impossible"<<endl;
return 0;
}
if(ans)
cout<<ans<<endl;
else cout<<"Impossible"<<endl;
return 0;
}