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号
浙公网安备 33010602011771号