rt,#12 说图没有联通。输出检查过了,选的是一条树边一条非树边,但是求出来的树边根本不在路径上。求助是哪里写挂了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 10;
const int inf = ~0u >> 1;
int t[MAXN];
int find(int k) {
return k == t[k] ? k : t[k] = find(t[k]);
}
struct node {
int u, v, w, id;
bool operator < (const node &rhs) const { return w < rhs.w; }
} a[MAXN];
struct edge {
int v, w, nxt, id;
} e[MAXN << 1];
int head[MAXN], tot;
inline
void add(int u, int v, int w, int id) {
e[++tot] = { v, w, head[u], id }, head[u] = tot;
}
ll ans; int cnt;
bool used[MAXN];
inline
void kruskal(int n, int m) {
for (int i = 1; i <= n; i++) t[i] = i;
sort(a + 1, a + m + 1);
for (int i = 1; i <= m; i++) {
int x = find(a[i].u), y = find(a[i].v);
if (x == y) continue;
add(a[i].u, a[i].v, a[i].w, a[i].id);
add(a[i].v, a[i].u, a[i].w, a[i].id);
t[x] = y, ans += a[i].w, used[a[i].id] = 1;
}
sort(a + 1, a + m + 1, [](const node &x, const node &y) { return x.id < y.id; });
}
int fa[MAXN][20], dep[MAXN], maxp[MAXN][20], id[MAXN][20], lg[MAXN];
void init(int u, int f, int w, int k) {
fa[u][0] = f, dep[u] = dep[f] + 1, maxp[u][0] = w, id[u][0] = k;
for (int i = 1; i <= lg[dep[u]]; i++) {
fa[u][i] = fa[fa[u][i - 1]][i - 1];
if (maxp[fa[u][i - 1]][i - 1] > maxp[u][i - 1]) {
maxp[u][i] = maxp[fa[u][i - 1]][i - 1], id[u][i] = id[fa[u][i - 1]][i - 1];
} else maxp[u][i] = maxp[u][i - 1], id[u][i] = id[u][i - 1];
}
for (int i = head[u], v; i; i = e[i].nxt) {
v = e[i].v;
if (v == f) continue;
init(v, u, e[i].w, e[i].id);
}
}
inline
void query(int u, int v, int &x, int &y) {
if (dep[u] < dep[v]) swap(u, v);
x = y = 0;
while (dep[u] > dep[v]) {
int k = lg[dep[u] - dep[v]];
if (x < maxp[u][k]) x = maxp[u][k], y = id[u][k];
u = fa[u][k];
}
for (int i = lg[dep[u]]; ~i; i--) {
if (fa[u][i] != fa[v][i]) {
if (x < maxp[u][i]) x = maxp[u][i], y = id[u][i];
if (x < maxp[v][i]) x = maxp[v][i], y = id[v][i];
u = fa[u][i], v = fa[v][i];
}
}
if (x < maxp[u][0]) x = maxp[u][0], y = id[u][0];
if (x < maxp[v][0]) x = maxp[v][0], y = id[v][0];
}
inline
int lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
while (dep[u] > dep[v]) u = fa[u][lg[dep[u] - dep[v]]];
if (u == v) return u;
for (int i = lg[dep[u]]; ~i; i--) {
if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
}
return fa[u][0];
}
inline
bool check(int x, int y, int z) {
int a = lca(x, y), b = lca(y, z), c = lca(x, z);
return a == b && c == z || a == c && b == z;
}
int n, m, s, c[MAXN];
int p, q, x, y, mk = -1;
int main() {
scanf("%d%d", &n, &m);
for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
for (int i = 1; i <= m; i++) scanf("%d", &a[i].w);
for (int i = 1; i <= m; i++) scanf("%d", &c[i]);
for (int i = 1; i <= m; i++) scanf("%d%d", &a[i].u, &a[i].v), a[i].id = i;
scanf("%d", &s), kruskal(n, m), init(1, 0, 0, 0);
for (int i = 1; i <= m; i++) {
if (used[i]) {
if (mk < s / c[i]) mk = s / c[i], p = q = i;
continue;
}
query(a[i].u, a[i].v, x, y);
if (mk < s / c[i] + x - a[i].w) mk = s / c[i] + x - a[i].w, p = y, q = i;
}
printf("%lld\n", ans - mk);
for (int i = 1; i <= m; i++) if (used[i] && i != p) printf("%d %d\n", i, a[i].w);
printf("%d %d\n", q, a[q].w - s / c[q]);
}