51Nod-1274-最长递增路径

来源:互联网 发布:淘宝下载ipad版5.1.1 编辑:程序博客网 时间:2024/06/05 11:20

ACM模版

描述

描述

题解

图上 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;}
0 0
原创粉丝点击