#include<iostream>
#include<unordered_map>
#include<vector>
#include<deque>
#include<algorithm>
#include<map>
#include<set>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#define int long long
using namespace std;
typedef long long ll;
const int N=4e5+10;
const int INF=0x3f3f3f;
typedef pair<ll,int>PII;
int n,m;
int h[N],ne[N],e[N],idx;
int din[N],w[N],dist[N];
bool st[N];
void init(){
memset(h,-1,sizeof h);
memset(dist,-INF,sizeof dist);
idx=0;
}
void add(int h[],int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
void topsort(bool flag){
queue<int>q;
for(int i=2;i<=n&&flag;i++){
if(!din[i]){
q.push(i);
}
}
if(!flag){
q.push(1);
dist[1]=0;
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=h[u];~i;i=ne[i]){
int v=e[i];
din[v]--;
// cout<<"u = "<<u<<" v = "<<v<<endl;
if(!flag)dist[v]=max(dist[u]+w[i],dist[v]);
// cout<<dist[v]<<endl;
if(!din[v]){
q.push(v);
}
}
}
}
void solve(){
init();
int a,b,c;
cin>>n>>m;
for(int i=1;i<=m;i++){
scanf("%lld %lld %lld",&a,&b,&c);
add(h,a,b,c);
din[b]++;
}
topsort(1);
topsort(0);
if(dist[n]>=-INF/2)cout<<dist[n]<<endl;
else cout<<-1<<endl;
}
signed main(){
int t=1;
//cin>>t;
while(t--) solve();
}
用topsort写有向无环图的最长路
最新推荐文章于 2025-05-27 21:52:10 发布