fork download
  1. #pragma GCC optimize ("O3")
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define ll long long
  5. #define db double
  6. #define is insert
  7. #define pb push_back
  8. #define pii pair<int, int>
  9. #define pll pair<long long, long long>
  10. #define X first
  11. #define Y second
  12. #define vi vector<int>
  13. #define vpi vector<pair<int, int>>
  14. #define msi multiset<int>
  15. #define int long long
  16. const int m97 = (int)1e9+7;
  17. const int N = 500005;
  18. const int inf = (int)1e18;
  19.  
  20. struct edge{
  21. int u, v, w;
  22. };
  23.  
  24. int n=0, m, c[N], ps[N], id;
  25. vpi adj[N];
  26. vi d;
  27. vector<edge> e, mst;
  28. bool used[N];
  29.  
  30. bool cmp(edge a, edge b){
  31. return a.w<b.w;
  32. }
  33.  
  34. void build(int n){
  35. for(int i=1; i<=n; i++) ps[i] = -1;
  36. }
  37.  
  38. int find(int i){
  39. return (ps[i]<0)?i:(ps[i]=find(ps[i]));
  40. }
  41.  
  42. bool same(int i, int j){
  43. return find(i)==find(j);
  44. }
  45.  
  46. void join(int i, int j){
  47. i=find(i), j=find(j);
  48. if(i==j) return;
  49. if(ps[i]<ps[j]){
  50. ps[i]+=ps[j];
  51. ps[j]=i;
  52. }
  53. else{
  54. ps[j]+=ps[i];
  55. ps[i]=j;
  56. }
  57. }
  58.  
  59. void reset(){
  60. for(int i=0; i<N; i++){
  61. adj[i].clear();
  62. }
  63. e.clear();
  64. mst.clear();
  65. d.clear();
  66. memset(c, 0, sizeof(c));
  67. memset(used, 0, sizeof(used));
  68. memset(ps, -1, sizeof(ps));
  69. }
  70.  
  71. void dfs(int u){
  72. used[u] = 1;
  73. for(pii p : adj[u]){
  74. int v = p.X;
  75. int w = p.Y;
  76. if(!used[v]){
  77. d.pb(c[v] - w);
  78. dfs(v);
  79. }
  80. }
  81. }
  82.  
  83. void korutcan(){
  84. sort(e.begin(), e.end(), cmp);
  85. for(edge x : e){
  86. if(same(x.u, x.v)) continue;
  87. join(x.u, x.v);
  88. mst.pb(x);
  89. adj[x.u].pb({x.v, x.w});
  90. adj[x.v].pb({x.u, x.w});
  91. }
  92. }
  93.  
  94. void solve(){
  95. cin >> n >> m;
  96. int mn = inf;
  97. for(int i=1; i<=n; i++){
  98. cin >> c[i];
  99. if(mn > c[i]){
  100. id = i;
  101. mn = c[i];
  102. }
  103. }
  104. int res = mn;
  105. build(n);
  106. int u, v, w;
  107. for(int i=1; i<=m; i++){
  108. cin >> u >> v >> w;
  109. e.pb({u, v, w});
  110. }
  111. korutcan();
  112. for(edge x : mst){
  113. res+= x.w;
  114. }
  115. cout << res << " ";
  116. dfs(id);
  117. sort(d.begin(), d.end());
  118. for(int v : d){
  119. res += v;
  120. cout << res << " ";
  121. }
  122. cout << "\n";
  123. }
  124.  
  125. signed main() {
  126. ios_base::sync_with_stdio(0);
  127. cin.tie(0); cout.tie(0);
  128. // freopen("input.tt", "r", stdin);
  129. // freopen("test.tt", "w", stdout);
  130. int _ = 1; cin >> _;
  131. while(_--){
  132. reset();
  133. solve();
  134. }
  135. }
Success #stdin #stdout 0.02s 23496KB
stdin
3
1 0
10
3 2
13 61 70
1 2 44
2 3 57
5 10
17 8 3 21 39
1 2 100
1 3 100
1 4 100
1 5 100
2 3 100
2 4 100
2 5 100
3 4 100
3 5 100
4 5 100
stdout
10 
114 127 144 
403 311 228 149 88