题目
https://www.luogu.org/problemnew/show/P3387
思路
用tarjan缩点,图就会变成一个DAG
用topsortDP即可
代码
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
const int M=500500;
int ind[M],maxa[M];
int n,m,i,j;
struct edge
{
int from,to,cost;
};
int bj[M]={0};
vector<edge>G[M];
int TopSort()
{
int tot=0;
queue<int>q;
for (i=1;i<=n;i++)
if (ind[i]==0)
q.push(i);
while (q.size())
{
int u=q.front();
q.pop();
for (i=0;i<G[u].size();i++)
{
ind[G[u][i].to]--;
if (bj[u]==1)
{
if (maxa[G[u][i].to]<maxa[u]+G[u][i].cost) maxa[G[u][i].to]=maxa[u]+G[u][i].cost;
bj[G[u][i].to]=1;
}
if (ind[G[u][i].to]==0)
q.push(G[u][i].to);
}
}
return tot;
}
int main()
{
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
edge now;
scanf("%d %d %d",&now.from,&now.to,&now.cost);
ind[now.to]++;
G[now.from].push_back(now);
}
maxa[n]=-1;bj[1]=1;
TopSort();
cout<<maxa[n]<<endl;
return 0;
}