求救!!!!
查看原帖
求救!!!!
406941
Register_int-std=c++14楼主2022/12/17 18:23

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]);
}
2022/12/17 18:23
加载中...