Advertisement
ke_timofeeva7

остовные деревья. минимальный каркас и шпионы

Apr 23rd, 2021
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.88 KB | None | 0 0
  1. //шпионы
  2. #include <iostream>
  3. #include <string>
  4. #include <sstream>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <memory.h>
  8. #include <stdio.h>
  9. #include <vector>
  10. #include <stack>
  11. #include <deque>
  12. #include <queue>
  13. #include <vector>
  14. #include <set>
  15. #include <iterator>
  16. #include <map>
  17. #include <iomanip>
  18. #define int long long
  19. #define fir first
  20. #define sec second
  21. #define pb push_back
  22. #define double long double
  23. #define endl "\n"
  24. #define un unsigned
  25. #define INF 1000000000
  26. using namespace std;
  27.  
  28. int gr[1005][1005];
  29.  
  30. signed main()
  31. {
  32.     int n, m;
  33.     cin >> n;
  34.  
  35.     for (int i = 0; i < n + 1; i++)
  36.     {
  37.         for (int j = 0; j < n; j++)
  38.         {
  39.             cin >> gr[i][j];
  40.         }
  41.     }
  42.  
  43.     for (int i = 0; i < n + 1; i++)
  44.     {
  45.         gr[i][n] = gr[n][i];
  46.     }
  47.  
  48.     n++;
  49.  
  50.     vector<int> min_e(n, INF); // вес минимального ребра из чёрной вершины в любую зелёную
  51.     vector<int> sel_e(n, INF); // куда ведёт ^ минимальное ребро из чёрной вершины в зелёную
  52.     vector<int> used(n, 0); // зёлные вершины
  53.  
  54.     min_e[0] = 0;
  55.  
  56.     int mst = 0;
  57.  
  58.     for (int i = 0; i < n; ++i)
  59.     {
  60.         int v = -1;
  61.  
  62.         for (int j = 0; j < n; ++j)
  63.         {
  64.             if (used[j] == 0 && (v == -1 || min_e[j] < min_e[v]))
  65.                 v = j;
  66.         }
  67.  
  68.         mst += min_e[v];
  69.         used[v] = 1;
  70.  
  71.         for (int j = 0; j < n; j++)
  72.         {
  73.             if (gr[v][j] != 0 && gr[v][j] < min_e[j])
  74.             {
  75.                 min_e[j] = gr[v][j];
  76.                 sel_e[j] = v;
  77.             }
  78.         }
  79.     }
  80.  
  81.     cout << mst;
  82.  
  83.     return 0;
  84. }
  85.    
  86.  
  87.  
  88. //минимальный каркас
  89. /*
  90. ЗАПУСКАЕМ
  91. ░░◐░░◐░░░ХАЧИКУДЖИ░░░░░░░░░
  92. ░░▐░░▌░░░░░░▄▄▄▄░░░░░░░░░░░
  93. ░░▐░░▌░░░▄▀▀░▄▄▄▀▀▄░░░░░░░░
  94. ░░▐▄▄▌░▐▀░▐▀▀░▄░▀▌░▀▌░░░░░░
  95. ░▐░░░░▀▐░▐░░░▄▄▌░░▌░▀▌░░░░░
  96. ░░▀▌░░░▐▄░▀▀▀░░░▄▄▌░▄▌░░░░░
  97. ░░░░▀▄░░░▐▄▄▄▀▀▀░░▄▀░░░░░░░
  98. ░░░░░░▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀░░░░░
  99. */
  100. #include <iostream>
  101. #include <string>
  102. #include <sstream>
  103. #include <cmath>
  104. #include <algorithm>
  105. #include <memory.h>
  106. #include <stdio.h>
  107. #include <vector>
  108. #include <stack>
  109. #include <deque>
  110. #include <queue>
  111. #include <vector>
  112. #include <set>
  113. #include <iterator>
  114. #include <map>
  115. #include <iomanip>
  116. #define int long long
  117. #define fir first
  118. #define sec second
  119. #define pb push_back
  120. #define double long double
  121. #define endl "\n"
  122. #define un unsigned
  123. #define INF 1000000000
  124. using namespace std;
  125.  
  126. const int N = 100'000;
  127. vector<pair<int, int>> gr[N];
  128.  
  129. signed main()
  130. {
  131.     ios_base::sync_with_stdio(0);
  132.     cin.tie(0);
  133.     cout.tie(0);
  134.  
  135.     int n, m;
  136.     cin >> n >> m;
  137.  
  138.     for (int i = 0; i < m; ++i)
  139.     {
  140.         int a, b, w;
  141.         cin >> a >> b >> w;
  142.         a--, b--;
  143.         gr[a].push_back({ b, w });
  144.         gr[b].push_back({ a, w });
  145.     }
  146.  
  147.     vector<int> min_e(n, INF); // вес минимального ребра из чёрной вершины в любую зелёную
  148.     vector<int> sel_e(n, INF); // куда ведёт ^ минимальное ребро из чёрной вершины в зелёную
  149.     vector<int> used(n, 0); // зёлные вершины
  150.  
  151.     min_e[0] = 0;
  152.  
  153.     int mst = 0;
  154.  
  155.     set<pair<int, int>> q; // { weight_edge, to }
  156.  
  157.     q.insert({ 0, 0 });
  158.  
  159.     for (int i = 0; i < n; ++i)
  160.     {
  161.         int v = q.begin()->second;
  162.         q.erase(q.begin());
  163.  
  164.         mst += min_e[v];
  165.         used[v] = 1;
  166.  
  167.         for (int i = 0; i < gr[v].size(); i++)
  168.         {
  169.             int u = gr[v][i].fir;
  170.             int w = gr[v][i].sec;
  171.  
  172.             if (!used[u] && min_e[u] > w)
  173.             {
  174.                 q.erase({ min_e[u], u });
  175.  
  176.                 min_e[u] = w;
  177.                 sel_e[u] = v;
  178.  
  179.                 q.insert({ min_e[u], u });
  180.             }
  181.         }
  182.     }
  183.  
  184.     cout << mst << '\n';
  185.  
  186.     return 0;
  187. }
  188.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement