首页 > 代码库 > 51nod1274 最长递增路径
51nod1274 最长递增路径
将边排序后dp一下就可以了。
#include<cstdio>#include<cstring>#include<cctype>#include<algorithm>using namespace std;#define rep(i,s,t) for(int i=s;i<=t;i++)#define dwn(i,s,t) for(int i=s;i>=t;i--)#define clr(x,c) memset(x,c,sizeof(x))int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-‘0‘,c=getchar(); return x;}const int nmax=5e4+5;const int inf=0x7f7f7f7f;struct node{ int u,v,d; node(int u,int v,int d):u(u),v(v),d(d){}; node(){}; bool operator<(const node&rhs)const{ return d<rhs.d;}};node ns[nmax];void maxs(int &a,int b){ if(a<b) a=b;}int g[nmax],dp[nmax];int main(){ int n=read(),m=read(),u,v,d; rep(i,1,m) ns[i].u=read(),ns[i].v=read(),ns[i].d=read(); sort(ns+1,ns+m+1); int last=0; rep(i,1,m){ if(i==m||ns[i].d<ns[i+1].d){ rep(j,last+1,i) g[ns[j].u]=dp[ns[j].u],g[ns[j].v]=dp[ns[j].v]; rep(j,last+1,i){ maxs(dp[ns[j].u],g[ns[j].v]+1); maxs(dp[ns[j].v],g[ns[j].u]+1); } last=i; } } int ans=0; rep(i,0,n-1) maxs(ans,dp[i]); printf("%d\n",ans); return 0;}
1274 最长递增路径
题目来源: Codility
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
收藏
关注
一个无向图,可能有自环,有重边,每条边有一个边权。你可以从任何点出发,任何点结束,可以经过同一个点任意次。但是不能经过同一条边2次,并且你走过的路必须满足所有边的权值严格单调递增,求最长能经过多少条边。
以此图为例,最长的路径是:
3 -> 1 -> 2 -> 3 -> 2 或
3 -> 1 -> 2 -> 3 -> 4 长度为4。
Input
第1行:2个数N, M,N为节点的数量,M为边的数量(1 <= N <= 50000, 0 <= M <= 50000)。节点编号为0 至 N - 1。第2 - M + 1行:每行3个数S, E, W,表示从顶点S到顶点E,有一条权值为W的边(0 <= S, E <= N - 1, 0 <= W <= 10^9)。
Output
输出最长路径的长度。
Input示例
6 80 1 41 2 31 3 22 3 53 4 64 5 65 0 83 2 7
Output示例
4
51nod1274 最长递增路径
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。