Advertisement
skaram

Untitled

Jan 28th, 2024 (edited)
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #ifndef Local
  4. #define debug(...) 1337
  5. #define endl '\n'
  6. #endif
  7.  
  8. using namespace std;
  9.  
  10. #define int long long
  11.  
  12. typedef long long ll;
  13. typedef long double ld;
  14.  
  15. #define all(x) (x).begin(), (x).end()
  16. #define sz(x) (int)(x).size()
  17.  
  18. template<typename T, typename U>
  19. bool smin(T &a, U b) {
  20.         if (a > b) {
  21.                 a = b;
  22.                 return true;
  23.         }
  24.         return false;
  25. }
  26.  
  27. template<typename T, typename U>
  28. bool smax(T &a, U b) {
  29.         if (a < b) {
  30.                 a = b;
  31.                 return true;
  32.         }
  33.         return false;
  34. }
  35.  
  36. const int maxn = 1e4 + 100;
  37. vector <pair<int, int>> g[maxn];
  38.  
  39. int a, b;
  40.  
  41. const int inf = 1e15;
  42.  
  43. struct dsu {
  44.         struct comp {
  45.                 int p, a = inf, b = inf;
  46.                 vector<int> v;
  47.         } c[maxn];
  48.  
  49.         int p[maxn];
  50.  
  51.         dsu() {
  52.                 for (int i = 1; i < maxn; ++i)
  53.                         p[i] = i, c[i].v = {i};
  54.         }
  55.  
  56.         int find(int v) {
  57.                 return p[v] == v ? v : p[v] = find(p[v]);
  58.         }
  59.  
  60.         int merge(int v, int u) {
  61.                 v = find(v), u = find(u);
  62.                 if (v == u)
  63.                         return 0;
  64.                 if (u == a)
  65.                         swap(v, u);
  66.                 if (u == b) {
  67.                         if (v == a)
  68.                                 return 2;
  69.                         swap(v, u);
  70.                 }
  71.                 if (v != a && v != b && sz(c[v].v) < sz(c[u].v))
  72.                         swap(v, u);
  73.                 p[u] = v;
  74.                 for (int &i: c[u].v)
  75.                         c[v].v.emplace_back(i);
  76.                 if (v == a) {
  77.                         for (int &i: c[u].v)
  78.                                 for (auto &[j, w]: g[i])
  79.                                         smin(c[find(j)].a, w);
  80.                 } else if (v == b) {
  81.                         for (int &i: c[u].v)
  82.                                 for (auto &[j, w]: g[i])
  83.                                         smin(c[find(j)].b, w);
  84.                 }
  85.                 smin(c[v].a, c[u].a);
  86.                 smin(c[v].b, c[u].b);
  87.                 c[u].v = {};
  88.                 return 1;
  89.         }
  90. };
  91.  
  92. void solve() {
  93.         int n, m;
  94.         cin >> n >> m;
  95.         vector <tuple<int, int, int>> edges;
  96.         int ans = inf;
  97.         for (int i = 0, v, u, w; i < m; ++i) {
  98.                 cin >> v >> u >> w;
  99.                 g[v].emplace_back(u, w);
  100.                 g[u].emplace_back(v, w);
  101.                 edges.emplace_back(w, v, u);
  102.         }
  103.         cin >> a >> b;
  104.         sort(all(edges));
  105.         dsu dsu;
  106.         for (int i = 1; i <= n; ++i) {
  107.                 int ta = (i == a ? 0 : inf), tb = (i == b ? 0 : inf);
  108.                 for (auto& [j, w] : g[i]) {
  109.                         if (j == a)
  110.                                 smin(ta, w);
  111.                         if (j == b)
  112.                                 smin(tb, w);
  113.                 }
  114.                 dsu.c[i].a = ta, dsu.c[i].b = tb;
  115.                 smin(ans, ta + tb);
  116.         }
  117.         for (auto& [w, v, u] : edges) {
  118.                 int f = dsu.merge(v, u);
  119.                 if (!f)
  120.                         continue;
  121.                 if (f == 2) {
  122.                         smin(ans, 3 * w);
  123.                         break;
  124.                 }
  125.                 for (int i = 1; i < maxn; ++i) {
  126.                         if (sz(dsu.c[i].v) && i != a && i != b) {
  127.                                 smin(ans, w * (1 + (i == a) + (i == b)) + dsu.c[i].a + dsu.c[i].b);
  128.                         }
  129.                 }
  130.         }
  131.         cout << ans << endl;
  132. }
  133.  
  134. signed main() {
  135.         ios::sync_with_stdio(false), cin.tie(nullptr);
  136.  
  137.         int tt = 1;
  138. //        cin >> tt;
  139.         while (tt--)
  140.                 solve();
  141.  
  142.         return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement