fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4.  
  5. const int MAXN = 1e5 + 15;
  6.  
  7. struct Edge {
  8. int u, v, w;
  9. };
  10.  
  11. struct cmp {
  12. bool operator() (Edge x, Edge y) {
  13. return x.w < y.w;
  14. }
  15. };
  16.  
  17. int C[MAXN];
  18. int N, P;
  19. vector<Edge> g;
  20.  
  21. struct Dosu {
  22. int par[MAXN], sz[MAXN];
  23. void INIT() {
  24. for (int i = 1; i <= MAXN - 1; i++) par[i] = i, sz[i] = 1;
  25. }
  26.  
  27. int find_set(int u) {
  28. return (par[u] == u ? u : par[u] = find_set(par[u]));
  29. }
  30.  
  31. void union_set(int u, int v) {
  32. u = find_set(u), v = find_set(v);
  33. if (sz[u] < sz[v]) swap(u, v);
  34. par[v] = par[u];
  35. sz[u] += sz[v];
  36. }
  37. } DSU;
  38.  
  39.  
  40. main() {
  41. ios_base::sync_with_stdio(0);
  42. cin.tie(0);
  43. cout.tie(0);
  44.  
  45. cin >> N >> P;
  46. DSU.INIT();
  47. int tmp = LONG_MAX;
  48. for (int i = 1; i <= N; i++) {
  49. cin >> C[i];
  50. tmp = min(tmp, C[i]);
  51. }
  52.  
  53. for (int i = 1; i <= P; i++) {
  54. int u, v, w;
  55. cin >> u >> v >> w;
  56. g.push_back({u, v, w * 2 + C[u] + C[v]});
  57. }
  58.  
  59. sort(g.begin(), g.end(), cmp());
  60.  
  61. int ans = 0;
  62.  
  63. for (auto E : g) {
  64. if (DSU.find_set(E.u) != DSU.find_set(E.v)) {
  65. DSU.union_set(E.u, E.v);
  66. ans += E.w;
  67. }
  68. }
  69.  
  70. cout << ans + tmp;
  71. }
  72.  
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
9223372036854775807