2 条题解
-
4
!提醒:这是一个目前推到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; }
- 1
信息
- ID
- 1962
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 60
- 已通过
- 32
- 上传者