将边排序后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;
}
 收藏
 收藏 关注
 关注
第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)。
输出最长路径的长度。
6 8 0 1 4 1 2 3 1 3 2 2 3 5 3 4 6 4 5 6 5 0 8 3 2 7
4
原文:http://www.cnblogs.com/fighting-to-the-end/p/5910719.html