fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define Shoyo ios_base::sync_with_stdio(0);cin.tie(NULL);
  5. #define pii pair<ll,ll>
  6. #define all(v) v.begin(), v.end()
  7. #define allr(v) v.rbegin(), v.rend()
  8. ll MOD = 1e9;
  9. const ll N=3e5;
  10. const ll INF = 1e17;
  11. const ll Log=20;
  12. ll ans[N][Log],mx[N][Log],dist[N];
  13. ll level[N]={0};
  14. vector<pii> adj[N];
  15. void dfs(ll u,ll p,ll w) {
  16. ans[u][0]=p;
  17. mx[u][0]=w;
  18. level[u]=level[p]+1;
  19. for (ll i=1;i<Log;i++) {
  20. ll dad=ans[u][i-1];
  21. ans[u][i]=ans[dad][i-1];
  22. mx[u][i]=max(mx[u][i-1],mx[dad][i-1]);
  23. }
  24. for (auto [v,we]:adj[u]) {
  25. if (v!=p) {
  26. dfs(v,u,we);
  27. }
  28. }
  29. }
  30. ll kth(ll u,ll k) {
  31. for (ll i=0;i<Log;i++) {
  32. if ((k>>i)&1) {
  33. u=ans[u][i];
  34. }
  35. }
  36. return u;
  37. }
  38. ll MX(ll u,ll k) {
  39. ll ret=0;
  40. for (ll i=0;i<Log;i++) {
  41. if ((k>>i)&1)
  42. ret=max(ret,mx[u][i]);
  43. }
  44. return ret;
  45. }
  46. ll LCA(ll u,ll v) {
  47. if (level[u]<level[v]) swap(u,v);
  48. u=kth(u,level[u]-level[v]);
  49. if (u==v) return u;
  50. for (ll i=Log-1;i>0;i--) {
  51. if (ans[u][i]!=ans[v][i]) {
  52. u=ans[u][i];
  53. v=ans[v][i];
  54. }
  55. }
  56. return ans[u][0];
  57. }
  58. ll get(ll u,ll v) {
  59. ll lca=LCA(u,v);
  60. u=MX(u,level[u]-level[lca]);
  61. v=MX(v,level[v]-level[lca]);
  62. return max(u,v);
  63. }
  64. struct DSU {
  65. vector<ll> parent;
  66. vector<ll> sz;
  67. void init(ll n) {
  68. parent.assign(n,0);
  69. sz.assign(n,1);
  70. iota(all(parent),0);
  71. }
  72. DSU(ll n) {
  73. init(n);
  74. }
  75. ll find(ll u) {
  76. if (u==parent[u]) return u;
  77. return parent[u]=find(parent[u]);
  78. }
  79. bool merge(ll u,ll v) {
  80. u=find(u);
  81. v=find(v);
  82. if (u==v) return false;
  83. if (sz[u]>sz[v])swap(u,v);
  84. parent[u]=v;
  85. sz[v]+=sz[u];
  86. return true;
  87. }
  88. };
  89. void solve() {
  90. ll n,m;cin>>n>>m;
  91. vector<array<ll,3>>ad;
  92. vector<pii> p(n);
  93. for(int i=0; i<m; i++) {
  94. ll u,v,w;cin>>u>>v>>w;
  95. u--; v--;
  96. p[i]={u,v};
  97. ad.push_back({w,u,v});
  98. }
  99. sort(all(ad));
  100. DSU dsu(n+1);
  101. ll wmst=0;
  102. for (auto [w,u,v]:ad) {
  103. if (dsu.merge(u,v)) {
  104. adj[u].push_back({v, w});
  105. adj[v].push_back({u, w});
  106. wmst+=w;
  107. }
  108. }
  109. dfs(1,0,0);
  110. for (auto [w,u,v]:ad) {
  111. ll mx=get(u,v);
  112. cout<<wmst-mx+w<<endl;
  113. }
  114. }
  115. int main() {
  116. Shoyo;
  117. ll t = 1;
  118. // if(!(cin >> t)) return 0;
  119. while (t--) {
  120. solve();
  121. }
  122. return 0;
  123. }
  124.  
Success #stdin #stdout 0.01s 15140KB
stdin
Standard input is empty
stdout
Standard output is empty