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