Advertisement
KanishAnand

solutionA_dp.cpp

Oct 28th, 2020 (edited)
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. vector<int> alpha, valu, beta;
  5. vector<vector<int>> adj, adj_mat, dp;
  6.  
  7. void dfs(int a, int par, vector<int> &vis) {
  8.     for (auto val : adj[a]) {
  9.         if (val != par) {
  10.             vis[val] = 1;
  11.             dfs(val, a, vis);
  12.         }
  13.     }
  14. }
  15.  
  16. void dp_dfs(int a, int par){
  17.     for (auto val : adj[a]) {
  18.         if (val != par) {
  19.             dp_dfs(val, a);
  20.             for (int i = 0; i <= alpha[a]; i++) {
  21.                 int p;
  22.                 for (int j = 0; j <= alpha[val]; j++) {
  23.                     int no = dp[val][j] - i*j*adj_mat[a][val];
  24.                     if(j == 0){
  25.                         p = no;
  26.                     }
  27.                     p = max(p, no);
  28.                 }
  29.                 dp[a][i] += p;
  30.             }
  31.         }
  32.     }
  33.  
  34.     for (int i = 0; i <= alpha[a]; i++) {
  35.         dp[a][i] += i*valu[a] - i*i*adj_mat[a][a];
  36.     }
  37. }
  38.  
  39. void backtrack_dp(int a, int  par, int ans){
  40.     // checking beta for node 'a'
  41.     for (int i = 0; i <= alpha[a]; i++) {
  42.         if(dp[a][i] == ans){
  43.             beta[a] = i;
  44.             break;
  45.         }
  46.     }
  47.  
  48.     int ind = beta[a];
  49.  
  50.     for(auto val : adj[a]){
  51.         if(val != par){
  52.             int p, store;
  53.             for (int j = 0; j <= alpha[val]; j++) {
  54.                 int no = dp[val][j] - ind*j*adj_mat[a][val];
  55.                 if(j == 0){
  56.                     p = no;
  57.                     store = j;
  58.                 }
  59.                 if(no > p){
  60.                     p = no;
  61.                     store = j;
  62.                 }
  63.             }
  64.             backtrack_dp(val, a, dp[val][store]);
  65.         }
  66.     }
  67. }
  68.  
  69. void solve() {
  70.     int n, a, b;
  71.     cin>>n;
  72.  
  73.     for (int i = 0; i < n; i++) {
  74.         cin>>a>>b;
  75.         alpha.push_back(a);
  76.         valu.push_back(b);
  77.     }
  78.  
  79.     adj.resize(n+2);  // adjacency list
  80.     adj_mat.resize(n+2,vector<int> (n+2,0));  // adjacency matrix
  81.  
  82.     for (int i = 0; i < n; i++) {
  83.         for (int j = 0; j < n; j++) {
  84.             cin>>a;
  85.             if(i < j && a != 0){
  86.                 adj[i].push_back(j);
  87.                 adj[j].push_back(i);
  88.             }
  89.             adj_mat[i][j] = a;
  90.             adj_mat[j][i] = a;
  91.         }
  92.     }
  93.  
  94.     int no_of_comp = 0;
  95.     vector<int> vis(n+2, 0);   // visited array
  96.  
  97.     // dfs to calculate number of components
  98.     for (int i = 0; i < n; i++) {
  99.         if(vis[i] == 0){
  100.             vis[i] = 1;
  101.             dfs(i, -1, vis);
  102.             no_of_comp++;
  103.         }
  104.     }
  105.    
  106.     cout<<no_of_comp<<endl;
  107.  
  108.     dp.resize(n+2,vector<int> (11,0));
  109.     // dp taking 0 as root
  110.     dp_dfs(0, -1);
  111.  
  112.     int ans = 0;
  113.     for (int i = 0; i <= alpha[0]; i++) {
  114.         ans = max(ans, dp[0][i]);
  115.     }
  116.  
  117.     cout<<ans<<endl;
  118.  
  119.     // backtracking to output beta values
  120.     beta.resize(n+2,-1);
  121.     backtrack_dp(0, -1, ans);
  122.  
  123.     for (int i = 0; i < n; i++) {
  124.         cout<<beta[i]<<" ";
  125.     }
  126.     cout<<endl;
  127. }
  128.  
  129. int main(void) {
  130.     ios::sync_with_stdio(0);
  131.     cin.tie(0);
  132.     cout.tie(0);
  133.     solve();
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement