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));
}

posted @ 2022-02-09 10:32  Bellala  阅读(41)  评论(0)    收藏  举报