```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
vector<int> vc1[1505];
vector<int> vc2[1505];
int in[1505],ans[1505];
void top_sort(int n){
queue<int> q;
for(int i=2;i<=n;i++){
ans[i]=-1e9;
if(!in[i]) q.push(i);
}
while(!q.empty()){
int a=q.front();
q.pop();
for(auto x:vc1[a]){
if(!--in[x]) q.push(x);
}
}
q.push(1);
while(!q.empty()){
int a=q.front();
q.pop();
for(int i=0;i<vc1[a].size();i++){
if(ans[vc1[a][i]]<ans[a]+vc2[a][i]) ans[vc1[a][i]]=ans[a]+vc2[a][i];
if(!--in[vc1[a][i]]) q.push(vc1[a][i]);
}
}
}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
vc1[u].push_back(v);
vc2[u].push_back(w);
in[v]++;
}
top_sort(n);
if(ans[n]==-1e9) cout<<-1;
else cout<<ans[n];
// fclose(stdin);
// fclose(stdout);
return 0;
}
/*
*/
```
1. `ans`数组的初始化应该是`-inf`左右,因为最长路有可能`<-1`在你的程序里就取最大值`-1`了。
2. 没有考虑无解情况。
3. 拓扑排序(top_sort)写错了,每次在遍历一个数之后要删入度,也就是`in[vc1[a][i]]`先减1之后再判断是否为0。
4. 拓扑排序是入度为 $0$ 才加入不是有入度的加入。
还好,不过可以先复习复习拓扑排序。
by weak_in_code @ 2024-03-27 21:00:30
@[XingChen_MoNian](/user/920938)
by weak_in_code @ 2024-03-27 21:01:08
@[weak_in_code](/user/753640)
非常感谢
已收到,得多练练拓扑排序了
by XingChen_MoNian @ 2024-03-27 22:33:20