求助 90 WA1
查看原帖
求助 90 WA1
676695
xiehanrui0817楼主2023/9/10 15:23

求调,悬赏一关注

#include <iostream>
#include <algorithm>

using namespace std;
using ll = long long;
using pii = pair<int, int>;

const ll INF = 1e15;
const int MAXN = 1e5 + 5, MAXM = 3e5 + 5, MAXL = 20;

struct Edge {
  int u, v, w;
  bool f;
  bool operator <(const Edge &i) const {
    return w < i.w;
  }
} e[MAXM];

int q, n, m, c[MAXN], d[MAXN], sz[MAXN], fa[MAXN][MAXL];
pii st[MAXN][MAXL];

inline int lowbit(int x) {
  return x & (-x);
}

int getf(int x) {
  return (fa[x][0] ? getf(fa[x][0]) : x);
}

int getd(int x) {
  if (!fa[x][0]) return (d[x] = 1);
  return (d[fa[x][0]] ? d[x] = d[fa[x][0]] + 1 : d[x] = getd(fa[x][0]) + 1);
}

void Merge(pii &ret, pii x) {
  if (x.first > ret.first) {
    ret.second = ret.first, ret.first = x.first;
    if (x.second > ret.second) {
      ret.second = x.second;
    }
  } else if (x.first < ret.first && x.first > ret.second) {
    ret.second = x.first;
  }
}

void init() {
  for (int i = 1; i <= n; i++) {
    d[i] = getd(i);
  }
  for (int j = 1; j < MAXL; j++) {
    for (int i = 1; i <= n; i++) {
      fa[i][j] = fa[fa[i][j - 1]][j - 1];
      st[i][j] = st[i][j - 1];
      Merge(st[i][j], st[fa[i][j - 1]][j - 1]);
    }
  }
}

void Find(int &x, int k, pii &ret) {
  while (k) {
    int v = lowbit(k);
    Merge(ret, st[x][c[v]]);
    x = fa[x][c[v]], k -= v;
  }
}

pii Lca(int x, int y) {
  pii ret = {-1, -1};
  if (d[x] < d[y]) swap(x, y);
  Find(x, d[x] - d[y], ret);
  if (x == y) return ret;
  for (int i = MAXL - 1; i >= 0; i--) {
    if (fa[x][i] != fa[y][i]) {
      Merge(ret, st[x][i]);
      Merge(ret, st[y][i]);
      x = fa[x][i], y = fa[y][i];
    }
  }
  Merge(ret, st[x][0]);
  Merge(ret, st[y][0]);
  return ret;
}

void Solve() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    sz[i] = 1;
  }
  for (int i = 1; i <= m; i++) {
    cin >> e[i].u >> e[i].v >> e[i].w;
  }
  sort(e + 1, e + m + 1);
  ll ans = 0;
  for (int i = 1; i <= m; i++) {
    int u = getf(e[i].u), v = getf(e[i].v);
    if (u != v) {
      if (sz[u] > sz[v]) swap(u, v);
      fa[u][0] = v, sz[v] += sz[u], st[u][0] = {e[i].w, -1};
      ans += e[i].w, e[i].f = 1;
    }
  }
  init();
  ll k = INF;
  for (int i = 1; i <= m; i++) {
    if (!e[i].f && e[i].u != e[i].v) {
      pii p = Lca(e[i].u, e[i].v);
      if (p.first == e[i].w) {
        if (p.second >= 0) {
          k = min(k, ans + e[i].w - p.second);
        }
      } else {
        k = min(k, ans + e[i].w - p.first);
      }
    }
  }
  cout << k;
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  for (int i = 1, j = 0; i < MAXN; i <<= 1, j++) {
    c[i] = j;
  }
  Solve();
  return 0;
}
2023/9/10 15:23
加载中...