描述
题解
图上 dp,由于要求严格递增,所以需要先对边权进行排序,保证每次添加边权都递增,但是这样并不能保证严格递增,存在相同长度的边时,我们需要记录下来一同处理,保证他们在添加时互不影响,这样就没什么问题了。
代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 5e4 + 10;
struct edge
{
int x, y, w;
} Edge[MAXN];
int N, M;
int dp[MAXN];
int temp[MAXN];
bool cmp(edge a, edge b)
{
return a.w < b.w;
}
int main()
{
scanf("%d%d", &N, &M);
for (int i = 0; i < M; i++)
{
scanf("%d%d%d", &Edge[i].x, &Edge[i].y, &Edge[i].w);
}
sort(Edge, Edge + M, cmp);
int last = -1;
for (int i = 0; i < M; i++)
{
if (i == M - 1 || Edge[i].w < Edge[i + 1].w)
{
for (int j = last + 1; j <= i; j++) // 防止重复加入,拷贝副本
{
temp[Edge[j].x] = dp[Edge[j].x];
temp[Edge[j].y] = dp[Edge[j].y];
}
for (int j = last + 1; j <= i; j++)
{
dp[Edge[j].x] = max(dp[Edge[j].x], temp[Edge[j].y] + 1);
dp[Edge[j].y] = max(dp[Edge[j].y], temp[Edge[j].x] + 1);
}
last = i;
}
}
int ans = 0;
for (int i = 0; i < N; i++)
{
ans = max(ans, dp[i]);
}
printf("%d\n",ans);
return 0;
}