Advertisement
ke_timofeeva7

лололодочки

Mar 28th, 2021
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <memory.h>
  7. #include <stdio.h>
  8. #include <vector>
  9. #include <stack>
  10. #include <deque>
  11. #include <queue>
  12. #include <vector>
  13. #include <set>
  14. #include <iterator>
  15. #include <map>
  16. #include <iomanip>
  17. //#define int long long
  18. #define fir first
  19. #define sec second
  20. #define pb push_back
  21. #define double long double
  22. #define endl "\n"
  23. #define un unsigned
  24. #define INF 1000000000
  25. using namespace std;
  26.  
  27. int n, m, k;
  28. vector<pair<int, int>> gr[10000];
  29. vector <vector<pair<int, int>>> g(10000);
  30.  
  31. int s, f;
  32. int dist[10005];
  33. pair<int,int> pr[10005];
  34.  
  35. void BFS(int v, int fin)
  36. {
  37.     fill(dist, dist + 10000, -1);
  38.    
  39.     memset(pr, 0, 10000);
  40.  
  41.     dist[v] = 0;
  42.  
  43.     queue <pair<int,int>> q;
  44.  
  45.     q.push({ v,INF });
  46.  
  47.     int maxim = INF;
  48.  
  49.     while (q.size() > 0)
  50.     {
  51.         pair<int,int> u = q.front();
  52.  
  53.         for (pair <int, int> p : g[u.first])
  54.         {
  55.             if (dist[p.first] == -1)
  56.             {
  57.                 dist[p.first] = dist[u.first] + 1;
  58.  
  59.                 pr[p.first].first = u.first;
  60.  
  61.                 if (pr[pr[p.first].first].second == 0)
  62.                 {
  63.                     maxim = p.second;
  64.                 }
  65.                 else
  66.                 {
  67.                     maxim = min(p.second, pr[pr[p.first].first].second);
  68.                 }
  69.  
  70.                 pr[p.first].second = maxim;
  71.  
  72.                 q.push(p);
  73.             }
  74.  
  75.             if (p.first == fin)
  76.             {              
  77.                 cout << pr[p.first].second << endl;
  78.  
  79.                 return;
  80.             }
  81.         }
  82.  
  83.         q.pop();
  84.     }
  85.  
  86.     return;
  87. }
  88.  
  89. signed main()
  90. {
  91.     ios_base::sync_with_stdio(0);
  92.     cin.tie(0);
  93.     cout.tie(0);
  94.  
  95.     cin >> n >> m >> k;
  96.  
  97.     for (int i = 0; i < m; ++i)
  98.     {
  99.         int a, b, w;
  100.         cin >> a >> b >> w;
  101.         a--, b--;
  102.         gr[a].push_back({ b, w });
  103.         gr[b].push_back({ a, w });
  104.     }
  105.  
  106.     vector<int> max_e(n, -1); // вес минимального ребра из чёрной вершины в любую зелёную
  107.     vector<int> sel_e(n, -1); // куда ведёт ^ минимальное ребро из чёрной вершины в зелёную
  108.     vector<int> used(n, 0); // зeлeные вершины
  109.  
  110.     max_e[0] = 0;
  111.  
  112.     int mst = 0;
  113.  
  114.     set<pair<int, int>> q; // { weight_edge, to }
  115.  
  116.     q.insert({ 0, 0 });
  117.  
  118.     for (int i = 0; i < n; ++i)
  119.     {
  120.         int v = (--q.end())->second;
  121.         q.erase(--q.end());
  122.  
  123.         if (i != 0)
  124.         {
  125.             g[sel_e[v]].push_back({ v, max_e[v] });
  126.             g[v].push_back({ sel_e[v], max_e[v] });
  127.         }
  128.         mst += max_e[v];
  129.         used[v] = 1;
  130.  
  131.         for (int i = 0; i < gr[v].size(); i++)
  132.         {
  133.             int u = gr[v][i].fir;
  134.             int w = gr[v][i].sec;
  135.  
  136.             if (!used[u] && max_e[u] < w)
  137.             {
  138.                 q.erase({ max_e[u], u });
  139.  
  140.                 max_e[u] = w;
  141.                 sel_e[u] = v;
  142.  
  143.                 q.insert({ max_e[u], u });
  144.             }
  145.         }
  146.     }
  147.  
  148.     /*for (int i = 0; i < n; i++)
  149.     {
  150.         if (sel_e[i] != -1)
  151.         {
  152.             g[sel_e[i]].pb({ i, max_e[i] });
  153.             g[i].pb({ sel_e[i], max_e[i] });
  154.         }      
  155.     }*/
  156.  
  157.     for (int i = 0; i < k; i++)
  158.     {
  159.         cin >> s >> f;
  160.  
  161.         s--;
  162.         f--;
  163.  
  164.         BFS(s, f);
  165.     }
  166.  
  167.     return 0;
  168. }
  169.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement