2 条题解

  • 4
    @ 2022-7-31 12:46:58

    !提醒:这是一个目前推到100分的题解(你提醒没了)

    emm如果有有缘人看见可以帮忙看一下哪里出现问题了吗

    谢谢

    初版思想

    60分:

    #include<bits/stdc++.h>
    using namespace std;
    struct tv
    {
        int av , relation ;
    };
    vector<tv> a[ 5001 ] ;
    int n , q , dis[ 5001 ][ 5001 ] , dismin[ 5001 ] ;
    bool vis[ 5001 ] ;
    queue<int> qu , q1 ;
    void bfs( int num )
    {
        while( !qu.empty())
        {
            int now = qu.front() ;
            qu.pop() ;
            for( int i = 0 ; i < a[ now ].size() ; i ++ )
            {
                if( !vis[ a[ now ][ i ].av ] )
                {
                    dismin[ a[ now ][ i ].av ] = min( dismin[ now ], a[ now ][ i ].relation ) ;
                    vis[ a[ now ][ i ].av ] = 1 ;
                    dis[ num ][ a[ now ][ i ].av ] = dismin[ a[ now ][ i ].av ] ;
                    qu.push( a[ now ][ i ].av ) ;
                }
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio( 0 ) ;
        cin.tie( 0 ) ;
        cin >> n >> q ;
        for( int i = 1 ; i <= n - 1 ; i ++ )
        {
            int t1 , t2 , t3 ;
            cin >> t1 >> t2 >> t3 ;
            a[ t1 ].push_back( ( tv ){ t2 , t3 } ) ;
            a[ t2 ].push_back( ( tv ){ t1 , t3 } ) ;
        }
        for( int i = 1 ; i <= n ; i ++ )
        {
            memset( dismin , 0x3f , sizeof( dismin ) ) ;
            memset( vis , 0 , sizeof( vis ) ) ;
            qu = q1 ;
            qu.push( i ) ;
            vis[ i ] = 1 ;
            bfs( i ) ;
        }
        for( int i = 1 ; i <= n ; i ++ )
        {
            sort( dis[ i ] + 1 , dis[ i ] + n + 1 ) ;
        }
        for( int i = 1 ; i <= q ; i ++ )
        {
            int ans = 0 , fz ;
            int t1 , t2 ;
            cin >> t1 >> t2 ;
            bool able = 1 ;
            for( int j = 1 ; j <= n ; j ++ )
            {
                if( dis[ t2 ][ j ] >= t1 )
                {
                    fz =  j ;
                    break ;
                }
                if( j == n ) 
                {
                    able = 0 ;
                    fz = n ;
                    break ;
                }
            }
            if( !able )
            {
                cout << 0 << "\n";
                continue ;
            }
            ans = n - fz + 1 ;
            cout << ans << "\n" ;
        }
        return 0;
    }
    

    面条老师:我认为你不用想那么多,建一棵树,然后每一次输入k,v,你都从v节点遍历,找相关度大于k的就好

    70分:

    #include<bits/stdc++.h>
    using namespace std;
    struct tv
    {
        int av , relation ;
    };
    vector<tv> a[ 5001 ] ;
    int n , q , dismin[ 5001 ] ;
    bool vis[ 5001 ] ;
    queue<int> qu , q1 ;
    int bfs( int num ,int relate )
    {
        int cont = 0 ;
        while( !qu.empty())
        {
            int now = qu.front() ;
            qu.pop() ;
            for( int i = 0 ; i < a[ now ].size() ; i ++ )
            {
                if( !vis[ a[ now ][ i ].av ] )
                {
                    dismin[ a[ now ][ i ].av ] = min( dismin[ now ], a[ now ][ i ].relation ) ;
                    if( dismin[ a[ now ][ i ].av ] >= relate ) cont ++ ;
                    vis[ a[ now ][ i ].av ] = 1 ;
                    qu.push( a[ now ][ i ].av ) ;
                }
            }
        }
        return cont ;
    }
    int main()
    {
        ios::sync_with_stdio( 0 ) ;
        cin.tie( 0 ) ;
        cin >> n >> q ;
        for( int i = 1 ; i <= n - 1 ; i ++ )
        {
            int t1 , t2 , t3 ;
            cin >> t1 >> t2 >> t3 ;
            a[ t1 ].push_back( ( tv ){ t2 , t3 } ) ;
            a[ t2 ].push_back( ( tv ){ t1 , t3 } ) ;
        }
        for( int i = 1 ; i <= q ; i ++ )
        {
            int ans = 0 , fz ;
            int t1 , t2 ;
            cin >> t1 >> t2 ;
            memset( dismin , 0x3f , sizeof( dismin ) ) ;
            memset( vis , 0 , sizeof( vis ) ) ;
            qu = q1 ;
            qu.push( t2 ) ;
            vis[ t2 ] = 1 ;
            cout << bfs( t2 , t1 ) << "\n" ;
        }
        return 0;
    }
    

    面条老师:小于k的就不用塞队列里面了吧

    100分:

    #include<bits/stdc++.h>
    using namespace std;
    struct tv
    {
        int av , relation ;
    };
    vector<tv> a[ 5001 ] ;
    int n , q , dismin[ 5001 ] ;
    bool vis[ 5001 ] ;
    queue<int> qu , q1 ;
    int bfs( int num , int relation2 )
    {
        int count1 = 0 ;
        while( !qu.empty())
        {
            int now = qu.front() ;
            qu.pop() ;
            for( int i = 0 ; i < a[ now ].size() ; i ++ )
            {
                if( !vis[ a[ now ][ i ].av ] )
                {
                    dismin[ a[ now ][ i ].av ] = min( dismin[ now ], a[ now ][ i ].relation ) ;
                    if( dismin[ a[ now ][ i ].av ] >= relation2 )
                    {
                        count1 ++ ;
                        qu.push( a[ now ][ i ].av ) ;
                    }
                    vis[ a[ now ][ i ].av ] = 1 ;
                }
            }
        }
        return count1 ;
    }
    int main()
    {
        ios::sync_with_stdio( 0 ) ;
        cin.tie( 0 ) ;
        cin >> n >> q ;
        for( int i = 1 ; i <= n - 1 ; i ++ )
        {
            int t1 , t2 , t3 ;
            cin >> t1 >> t2 >> t3 ;
            a[ t1 ].push_back( ( tv ){ t2 , t3 } ) ;
            a[ t2 ].push_back( ( tv ){ t1 , t3 } ) ;
        }
        for( int i = 1 ; i <= q ; i ++ )
        {
            int t1 , t2 ;
            cin >> t1 >> t2 ;
            memset( dismin , 0x3f , sizeof( dismin ) ) ;
            memset( vis , 0 , sizeof( vis ) ) ;
            qu = q1 ;
            qu.push( t2 ) ;
            vis[ t2 ] = 1 ;
            cout << bfs( t2 , t1 ) << "\n" ;
        }
        return 0;
    }
    
    • 3
      @ 2022-7-29 17:27:45

      这道题没什么可说的 但我想吐槽的是 usaco的竞赛题为什么我经常连题都读不懂 太恶心了 建议直接吧英语奉上自己读吧,翻译的云里雾里的 也有可能我太菜了

      • 1

      信息

      ID
      1962
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      (无)
      递交数
      60
      已通过
      32
      上传者