codeforces 459E E. Pashmak and Graph(dp)

3121 단어 dpcodeforces

제목 링크:


codeforces 459E

제목 대의:


n개의 점, m변의 유방향도를 제시하고 각 변은 변권이 있으며 가장 긴 변권이 상승하는 경로의 길이를 구한다.

제목 분석:


4
  • dp[i]를 정의하면 i조의 끝이 있는 상황에서 가장 긴 경로를 나타냅니다

  • 4
  • g[i]는 점 i가 끝나는 상황을 나타내는 가장 긴 경로를 정의합니다

  • 4
  • 모든 변을 정렬하면 앞의 변은 뒤의 변보다 작을 수 있다

  • 그래서 dp[i]=g[e[i].u]+1
    4
  • 그리고 가장자리가 같은 상황을 특별히 고려하여 g[i]를 업데이트하면 됩니다. 구체적인 코드는 다음과 같습니다

  • AC 코드:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #define MAX 300007
    
    using 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
    "
    , ans ); } }

    좋은 웹페이지 즐겨찾기