题意:一个有向图,可非连通,可重边,可自环,每条边上有权值。问权值严格递增,且路径不能违背输入顺序,的最长路径(指边数最多)的边数是多少。
题解:用map存1e5个线段树,Query(u, x),表示以u为终点,且与u相连的边权值不大于x的最长路径边数。
状态按输入顺序转移,比如现在输入<u, v, w>。
那么状态从u转移到v,就是将v的w处更新为Query(u, w-1) + 1。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 +10;
int n, m;
map<int, int> bits[maxn];
int Query(int u, int i)
{
int ans = 0;
while(i){
ans = max(ans, bits[u][i]);
i -= i & -i;
}
return ans;
}
int Update(int u, int i, int val)
{
while(i){
bits[u][i] = max(bits[u][i], val);
i += i & -i;
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0, u, v, w; i < m; i++){
scanf("%d%d%d", &u, &v, &w);
Update(v, w + 1, Query(u, w) + 1);
}
int ans = 0;
for(int i = 1; i <= n; i++){
ans = max(ans, Query(i, 100001));
}
printf("%d\n", ans);
return 0;
}