本文共 1128 字,大约阅读时间需要 3 分钟。
给出n个点,m条边的有向图,每个边有边权,求一条最长的边权上升的路径的长度。
#include#include #include #include #define MAX 300007using namespace std;int n,m;int dp[MAX],g[MAX];struct Edge{ int u,v,w; bool operator < ( const Edge& a ) const { return w < a.w; }}e[MAX];int main ( ){ while ( ~scanf ( "%d%d" , &n , &m ) ) { for ( int i = 0 ; i < m ; i++ ) scanf ( "%d%d%d" , &e[i].u , &e[i].v , &e[i].w ); sort ( e , e+m ); int t = 0; e[m].w = -1; int ans = 0; for ( int i = 0 ; i < m ; i++ ) { int v = e[i].v; int u = e[i].u; int w = e[i].w; dp[i] = g[e[i].u]+1; if ( e[i].w != e[i+1].w ) { for ( int j = t ; j <= i ; j++ ) g[e[j].v] = max ( g[e[j].v] , dp[j] ); t = i+1; } ans = max ( ans , dp[i] ); } printf ( "%d\n" , ans ); }}
转载地址:http://lqvjn.baihongyu.com/