Advertisement
Dimaush

Untitled

Nov 7th, 2022
1,142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <cmath>
  5. #include <queue>
  6. #include <utility>
  7. #include <algorithm>
  8.  
  9. const std::string nucl = "ATGC";
  10.  
  11. unsigned dist(std::string a, std::string b) {
  12.     unsigned d = 0;
  13.     for (unsigned i = 0; i < a.length(); ++i) {
  14.         unsigned curr = (nucl.find(a[i]) > nucl.find(b[i]) ? nucl.find(a[i]) - nucl.find(b[i]) : nucl.find(b[i]) - nucl.find(a[i]));
  15.         d += std::min(curr, 4 - curr);
  16.     }
  17.     return d;
  18. }
  19.  
  20. int main() {
  21.     unsigned n, l;
  22.     std::cin >> n >> l;
  23.     std::vector<std::string> acids(n + 1);
  24.     acids[0] = std::string(l, 'A');
  25.     for (unsigned i = 1; i < n + 1; ++i) {
  26.         std::cin >> acids[i];
  27.     }
  28.  
  29.     std::vector<std::vector<unsigned>> matrix(n + 1, std::vector<unsigned>(n + 1, 0));
  30.     for (unsigned i = 0; i < n + 1; ++i) {
  31.         for (unsigned j = 0; j < n + 1; ++j) {
  32.             matrix[i][j] = dist(acids[i], acids[j]);
  33.         }
  34.     }
  35.  
  36.     std::vector<bool> used(n + 1, false);
  37.     unsigned mst_weight = 0;
  38.     std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> q;
  39.     q.push({0, 0});
  40.     while (!q.empty()) {
  41.         std::pair<int, int> c = q.top();
  42.         q.pop();
  43.         int dst = c.first, v = c.second;
  44.         if (used[v]) {
  45.             continue;
  46.         }
  47.         used[v] = true;
  48.         mst_weight += dst;
  49.         for (unsigned u = 0; u < n + 1; ++u) {
  50.             unsigned len_vu = matrix[v][u];
  51.             if (!used[u]) {
  52.                 q.push({len_vu, u});
  53.             }
  54.         }
  55.     }
  56.     std::cout << mst_weight << std::endl;
  57.  
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement