Advertisement
deadwing97

GRAPHTRE Editorialist

Feb 23rd, 2019
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MX = 5005 , MOD = 1000000007;
  6.  
  7. vector < int > v[MX];
  8.  
  9. int T , n , m;
  10.  
  11. pair < int , int > arr[MX];
  12.  
  13. int dp[MX][MX] , val[MX] , tot[MX][MX];
  14.  
  15. int main(){
  16.     scanf("%d",&T);
  17.     while(T--){
  18.  
  19.         scanf("%d %d",&n,&m);
  20.  
  21.         for(int j = 0 ; j <= n ; j++){
  22.             v[j].clear();
  23.             for(int i = 0 ; i <= n ; i++){
  24.                 dp[j][i] = 0;
  25.                 tot[j][i] = 0;
  26.             }
  27.         }
  28.  
  29.         for(int j = 1 ; j <= n ; j++){
  30.             scanf("%d",&arr[j].first);
  31.             val[j] = arr[j].first;
  32.             arr[j].second = j;
  33.         }
  34.  
  35.         for(int j = 1 ; j <= m ; j++){
  36.             int a , b;
  37.             scanf("%d %d",&a,&b);
  38.             v[a].push_back(b);
  39.             v[b].push_back(a);
  40.         }
  41.  
  42.         sort(arr+1 , arr+1+n);
  43.         reverse(arr+1 , arr+1+n);
  44.  
  45.         dp[0][0] = 1;
  46.  
  47.         for(int nodes = 1 ; nodes <= n ; nodes++){
  48.  
  49.             int bigger = 0;
  50.  
  51.             int node = arr[nodes].second;
  52.  
  53.             for(auto nxt : v[node])
  54.                 if(val[nxt] > val[node])
  55.                     ++bigger;
  56.  
  57.             for(int trees = 1 ; trees <= nodes ; trees++){
  58.  
  59.                 // ways of constructing [trees] trees with first [nodes] nodes
  60.  
  61.                 //add our new node as new root
  62.  
  63.                 dp[nodes][trees] = dp[nodes-1][trees-1];
  64.  
  65.                 //add it to some other parent
  66.  
  67.                 dp[nodes][trees] += (1ll * bigger * dp[nodes - 1][trees])%MOD; dp[nodes][trees] %= MOD;
  68.  
  69.  
  70.  
  71.                 // in case of adding new root we will have same respects and we add our node value to each single way
  72.  
  73.                 tot[nodes][trees] = (1ll * tot[nodes - 1][trees - 1] + 1ll * val[node] * dp[nodes - 1][trees - 1])%MOD;
  74.  
  75.                 // in case of connecting it to some parent the sum of respects will remain the same except that for each way we can construct new forests
  76.                 // so we need to multiply the total respects
  77.  
  78.                 tot[nodes][trees] += (1ll * tot[nodes - 1][trees] * bigger)%MOD;
  79.  
  80.  
  81.                 tot[nodes][trees] %= MOD;
  82.  
  83.  
  84.  
  85.  
  86.             }
  87.  
  88.         }
  89.  
  90.         for(int j = 1 ; j <= n ; j++){
  91.  
  92.             cout<<tot[n][j]<<' ';
  93.  
  94.         }
  95.  
  96.         cout<<endl;
  97.     }
  98.  
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement