cf459 E. Pashmak and Graph(dp)
题意:
图有 n 个点和 m 条有向带权边,求边权严格上升的路最长路的长度
\(n\le 3e5,m\le 3e5,1\le w_i\le 1e5\)
思路:
\(f[u]\) 表示以节点 \(u\) 结尾的答案,按边权从小到大考虑每一条边,用边的起点更新终点。
要求严格上升,所以每次更新时只能用小于当前边的边。 wei[w] 存权为 w 的所有边,每次用旧数据 g[] 来更新。
代码中 g[] 才是真dp数组,f[] 不过是记录更新的临时数组。
const int N = 3e5 + 5, M = 1e5 + 5;
int n, m;
vector<PII> wei[M];
int f[N], g[N];
signed main()
{
scanf("%d%d", &n, &m);
while(m--)
{
int a, b, w; scanf("%d%d%d", &a, &b, &w);
wei[w].pb({a, b});
}
for(int w = 1; w < M; w++)
{
vector<int> change;
for(auto [a, b] : wei[w])
f[b] = max(f[b], g[a] + 1), change.pb(b);
for(int i : change)
g[i] = f[i];
}
printf("%d", *max_element(g + 1, g + 1 + n));
}

浙公网安备 33010602011771号