Advertisement
Guest User

Untitled

a guest
Jun 24th, 2023
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fr first
  4. #define sc second
  5. #define pb push_back
  6. #define mp make_pair
  7. #define int long long
  8.  
  9. signed main(){
  10.     ios::sync_with_stdio(0);
  11.     cin.tie(0);
  12.     int n, r, m;
  13.     cin >> n >> r >> m;
  14.     vector<pair<int,int>>adj[n];
  15.     vector<int>delta[n][n][n];
  16.     int mat[n][n][n];
  17.     for (int i = 0; i < n; i++){
  18.         for (int j = 0; j < n; j++){
  19.             for (int e = 0; e < n; e++){
  20.                 mat[i][j][e] = (int)1e18;
  21.                 delta[i][j][e] = {(int)1e18};
  22.             }
  23.         }
  24.     }
  25.     for (int i = 0; i < r; i++){
  26.         int a,b, c;
  27.         cin >> a >> b >> c;
  28.         --a,--b;
  29.         adj[a].pb(mp(b,c));
  30.         adj[b].pb(mp(a,c));
  31.     }
  32.     vector<int>kuponi(m);
  33.     for (int i = 0; i < m; i++)cin >> kuponi[i];
  34.     sort(kuponi.rbegin(), kuponi.rend());
  35.     int sum = 0;
  36.     for (int i = 0; i < n; i++){
  37.         for (auto j : adj[i]){
  38.             mat[i][j.fr][1] = max(0LL, j.sc - kuponi[0]);
  39.             mat[j.fr][i][1] = max(0LL, j.sc - kuponi[0]);
  40.             delta[i][j.fr][1] = {j.sc};
  41.             delta[j.fr][i][1] = {j.sc};
  42.         }
  43.     }
  44.  
  45.          
  46.     for(int e1 = 0; e1 < n; e1++){
  47.             for (int e2 = 0; e2 + e1 < n; e2++){
  48.                 for (int k = 0; k < n; k++){
  49.                     for (int a = 0; a < n; a++){
  50.                         for (int b = 0; b < n; b++){
  51.                             vector<int>nova = delta[a][k][e1];
  52.                             for (auto el : delta[k][b][e2])nova.pb(el);
  53.                             sort(nova.rbegin(),nova.rend());
  54.                             int tot = 0;
  55.                             for (int p = 0; p < (int)nova.size(); p++){
  56.                                 if (p < m)tot += max(0LL, nova[p] - kuponi[p]);
  57.                                 else tot += nova[p];
  58.                            }
  59.                            if (mat[a][b][e1 + e2] > tot){
  60.                            mat[a][b][e1+e2] = tot;
  61.                            delta[a][b][e1+e2] = nova;
  62.                            }
  63.                        }
  64.                   }
  65.              }
  66.          }
  67.     }
  68.     for (int i = 0; i < n; i++){
  69.         for (int j = i + 1; j < n; j++){
  70.         int best = (int)1e18;
  71.         for (int p = 0; p < n; p++){
  72.             best = min(best, mat[i][j][p]);
  73.         }
  74.         sum += best;
  75.       }
  76.     }
  77.     cout<<sum;
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement