Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define f first
- #define s second
- #define ll long long
- #define pb push_back
- #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
- #define mp make_pair
- using namespace std;
- const int MAXN = 2e5 + 5;
- const int INF = 1e9 + 7;
- const int MOD = 1e9 + 7;
- ll binpower(ll x, ll y, ll mod){
- if (y == 0)
- return 1;
- if (y % 2 == 1){
- return (binpower(x, y - 1, mod) * x) % mod;
- }
- ll z = binpower(x, y / 2, mod);
- return (z * z) % mod;
- }
- const int L = 19;
- pair <int, pair <int, int> > a[MAXN], b[MAXN];
- int tin[MAXN], tout[MAXN], up[MAXN][L + 1], mx[MAXN][L + 1];
- int dsu[MAXN], cnt[MAXN];
- vector <pair <int, int> > g[MAXN];
- int ffind(int x){
- int y = x;
- while (dsu[x] != x){
- x = dsu[x];
- }
- int z;
- while(dsu[y] != y){
- z = dsu[y];
- dsu[y] = x;
- y = z;
- }
- return x;
- }
- void uunion(int x, int y){
- x = ffind(x);
- y = ffind(y);
- if (cnt[x] > cnt[y]){
- dsu[y] = x;
- cnt[x] += cnt[y];
- }
- else{
- dsu[x] = y;
- cnt[y] += cnt[x];
- }
- }
- bool was[MAXN];
- map <pair <int, int>, bool > ma;
- int timer = 0;
- bool upper(int v, int u){
- return (tin[v] <= tin[u] && tout[u] <= tout[v]);
- }
- void dfs(int v, int pr = 0, int dist = 0){
- was[v] = 1;
- up[v][0] = pr;
- mx[v][0] = dist;
- tin[v] = ++timer;
- for (int i = 1; i <= L; i++){
- up[v][i] = up[up[v][i - 1]][i - 1];
- mx[v][i] = max(mx[v][i - 1], mx[up[v][i - 1]][i - 1]);
- }
- for (auto [to, len] : g[v]){
- if (!was[to]){
- dfs(to, v, len);
- }
- }
- tout[v] = ++timer;
- }
- int lca(int a, int b){
- if (upper(a, b))
- return a;
- if (upper(b, a)){
- return b;
- }
- for (int i = L; i >= 0; i--){
- if (!upper(up[a][i], b)){
- a = up[a][i];
- }
- }
- return up[a][0];
- }
- int get_max(int v, int v_lca){
- int maxx = 0;
- for (int i = L; i >= 0; i--){
- if (!upper(up[v][i], v_lca)){
- maxx = max(maxx, mx[v][i]);
- v = up[v][i];
- }
- }
- if (v != v_lca)
- maxx = max(maxx, mx[v][0]);
- return maxx;
- }
- void solve(int Test){
- tout[0] = INF;
- int n, m;
- cin >> n >> m;
- for (int i = 1; i <= n; i++){
- cnt[i] = 1;
- dsu[i] = i;
- }
- for (int i = 1; i <= m; i++){
- cin >> b[i].s.f >> b[i].s.s >> b[i].f;
- a[i] = b[i];
- }
- sort(b + 1, b + m + 1);
- ll ans = 0;
- for (int i = 1; i <= m; i++){
- if (ffind(b[i].s.f) != ffind(b[i].s.s)){
- uunion(b[i].s.f, b[i].s.s);
- ans += b[i].f;
- g[b[i].s.f].pb({b[i].s.s, b[i].f});
- g[b[i].s.s].pb({b[i].s.f, b[i].f});
- ma[b[i].s] = 1;
- }
- }
- dfs(1);
- for (int i = 1; i <= m; i++){
- if (ma.count(a[i].s) == 1){
- cout << ans << '\n';
- }
- else{
- int v_lca = lca(a[i].s.f, a[i].s.s);
- int maxx = max(get_max(a[i].s.f, v_lca),
- get_max(a[i].s.s, v_lca));
- cout << ans + a[i].f - maxx << "\n";
- }
- }
- }
- main() {
- IOS;
- srand(time(0));
- int t = 1;
- //cin >> t;
- int T = 1;
- while(t--){
- solve(T);
- T++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment