#include<bits/stdc++.h> usingnamespace std; constint LEN = 5e4 + 50, MIN = 0xc0c0c0c0; int n, m, tot, head[LEN], dp[LEN], ind[LEN]; queue<int> q; structedge { int to_, nxt_, w_; } e[LEN];
voidadd(int u, int v, int w){ e[tot].nxt_ = head[u], e[tot].to_ = v, e[tot].w_ = w; head[u] = tot++; }
voidtoposort(){ dp[1] = 0; for (int i = 1; i <= n; ++i) { if (!ind[i]) { q.emplace(i); } } while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; ~i; i = e[i].nxt_) { int v = e[i].to_; if (dp[u] != MIN) dp[v] = max(dp[v], dp[u] + e[i].w_); if (--ind[v] == 0) q.emplace(v); } } }
intmain(){ int u, v, w; cin >> n >> m; memset(head, -1, sizeof(head)), memset(dp, 0xc0, sizeof(dp)); for (int i = 1; i <= m; ++i) { cin >> u >> v >> w; add(u, v, w); ++ind[v]; } toposort(); cout << (dp[n] == MIN ? -1 : dp[n]); return0; }
思路
题目说明了是有向无环图,即DAG,那么就可以使用拓扑排序
设dp[x]为到达结点x的最长路径,可以找到状态转移方程:
\[
dp\left[ v \right] =\max \left( dp\left[ v \right] ,dp\left[ u \right]
+w \right) ,u\xrightarrow{w}v
\]
题目问的仅仅是1到n的最长路径,除1以外的、入度为0的结点为起点的路径就要无视掉