MnZn 90 pts WA on #3 求助
查看原帖
MnZn 90 pts WA on #3 求助
677234
FstAutoMaton楼主2023/7/25 09:37

RT, code :

#include <bits/stdc++.h>

using namespace std;
using LL = long long;
using Pii = pair<int, LL>;

const int kMaxN = 3e5 + 5, kL = 21;

struct E {
  LL u, v, w;
  bool operator<(const E &a) const {
    return w < a.w;
  }
} e[kMaxN * 3];

LL n, m, ans = 1e18, tot, cnt, p[kMaxN * 3], dep[kMaxN], f[kMaxN][kL], g[kMaxN][kL];  //  p记录路径上的值,dep记录节点深度,f求2^i级祖先,g求路径最大值
LL t[kMaxN][kL], fa[kMaxN], vis[kMaxN * 3];                                           //  t记录路径次大值,fa并查集,vis边是否在最小生成树中
vector<Pii> v[kMaxN];

int find(int x) {
  return fa[x] == x ? x : fa[x] = find(fa[x]);
}

void dfs(int u, int fa) {
  for (int i = 1; i < kL; i++) {
    f[u][i] = f[f[u][i - 1]][i - 1];
    g[u][i] = max(g[u][i - 1], g[f[u][i - 1]][i - 1]);
    LL s[4] = {g[u][i - 1], t[u][i - 1], g[f[u][i - 1]][i - 1], t[f[u][i - 1]][i - 1]};
    sort(s, s + 4);
    int sx = unique(s, s + 4) - s;
    t[u][i] = s[sx - 1];
  }
  for (Pii i : v[u]) {
    if (i.first != fa) {
      f[i.first][0] = u, g[i.first][0] = i.second, dep[i.first] = dep[u] + 1;
      dfs(i.first, u);
    }
  }
}

int LCA(int x, int y) {
  if (dep[x] < dep[y]) {
    swap(x, y);
  }
  for (int i = kL - 1; i >= 0; i--) {
    (dep[f[x][i]] >= dep[y]) && (x = f[x][i]);
  }
  if (x == y) {
    return x;
  } else {
    for (int i = kL - 1; i >= 0; i--) {
      (f[x][i] != f[y][i]) && (x = f[x][i], y = f[y][i]);
    }
    return f[x][0];
  }
}

void S(int x, int y) {
  for (int i = kL - 1; i >= 0; i--) {
    (dep[f[x][i]] >= dep[y]) && (p[++tot] = g[x][i], p[++tot] = t[x][i], x = f[x][i]);
  }
}

int main() {
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    cin >> e[i].u >> e[i].v >> e[i].w;
  }
  sort(e + 1, e + m + 1);
  for (int i = 1; i <= n; i++) {
    fa[i] = i;
  }
  for (int i = 1; i <= m; i++) {
    if (find(e[i].u) != find(e[i].v)) {
      fa[find(e[i].u)] = find(e[i].v);
      v[e[i].u].push_back({e[i].v, e[i].w});
      v[e[i].v].push_back({e[i].u, e[i].w});
      vis[i] = 1;
      cnt += e[i].w;
    }
  }
  dfs(1, 0);
  for (int i = 1; i <= m; i++) {
    if (!vis[i] && e[i].u != e[i].v) {
      int lca = LCA(e[i].u, e[i].v);
      S(e[i].u, lca), S(e[i].v, lca);
      sort(p + 1, p + tot + 1);
      tot = unique(p + 1, p + tot + 1) - p - 1;
      if (p[tot] == e[i].w) {
        ans = min(ans, e[i].w - p[tot - 1]);
      } else {
        ans = min(ans, e[i].w - p[tot]);
      }
      tot = 0;
    }
  }
  cout << ans + cnt;
  return 0;
}
2023/7/25 09:37
加载中...