10pts 求助
查看原帖
10pts 求助
215368
Easy_revenge楼主2020/10/20 23:15

不太明白哪里写挂了 qwq

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;

const int maxn = 5e5 + 10;

struct Edge {
	int u, v, w, nxt;
} edge1[maxn << 1], edge[maxn << 1]; int head1[maxn], head[maxn], tot1, tot;

inline void init1(int u, int v, int w) {
	edge1[++tot1] = (Edge){ u, v, w, head1[u] }; head1[u] = tot1;
}

inline void init(int u, int v, int w) {
	edge[++tot] = (Edge){ u, v, w, head[u] }; head[u] = tot;
}

int n, m, k, f[maxn];
int d[maxn], fa[maxn][22], t, ans = 0x3f3f3f3f, mn[maxn][22]; bool vis[maxn]; queue<int> q;

int anc(int x) {
	if (f[x] == x) return x;
	return f[x] = anc(f[x]);
}

inline bool cmpa(Edge a, Edge b) {
	return a.w > b.w;
}

inline void kruskal() {
	int cntt = 0;
	sort(edge1 + 1, edge1 + 1 + tot1, cmpa);
	for (int i = 1; i <= tot1; ++i) {
		int u = edge1[i].u, v = edge1[i].v, w = edge1[i].w;
		int fau = anc(u), fav = anc(v);
		if (fau == fav) continue;
		init(u, v, w); init(v, u, w);
		f[fau] = fav;
		if (++cntt == n - 1) return;
	}
}

inline void bfs(int root) {
	d[root] = 1; q.push(root);
	while (q.size()) {
		int u = q.front(); q.pop();
		vis[u] = true;
		for (int i = head[u]; i; i = edge[i].nxt) {
			int v = edge[i].v, w = edge[i].w;
			if (d[v]) continue;
			d[v] = d[u] + 1;
			fa[v][0] = u; mn[v][0] = w;
			for (int j = 1; j <= t; ++j) {
				fa[v][j] = fa[fa[v][j - 1]][j - 1];
				mn[v][j] = min(mn[v][j - 1], mn[fa[v][j - 1]][j - 1]);
			}
			q.push(v);
		}
	}
}

inline int lca(int x, int y) {
	if (x > y) swap(x, y);
	for (int i = t; i >= 0; --i) {
		if (d[fa[y][i]] >= d[x]) {
			ans = min(ans, mn[y][i]);
			y = fa[y][i];
		}
	}
	if (x == y) return x;
	for (int i = t; i >= 0; --i) {
		if (fa[x][i] != fa[y][i]) {
			ans = min(ans, min(mn[x][i], mn[y][i]));
			x = fa[x][i], y = fa[y][i];
		}
	}
	ans = min(ans, min(mn[x][0], mn[y][0]));
	return fa[x][0];
}

int main() {
	memset(mn, 0x3f, sizeof(mn));
	scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) f[i] = i; t = int(log(n) / log(2)) + 1;
	for (int i = 1; i <= m; ++i) {
		int p1, p2, pw; scanf("%d%d%d", &p1, &p2, &pw);
		init1(p1, p2, pw); init1(p2, p1, pw);
	}
	kruskal();
	for (int i = 1; i <= n; ++i) {
		if (!vis[i]) bfs(i); 
	}
	scanf("%d", &k);
	for (int i = 1; i <= k; ++i) {
		int p1, p2; scanf("%d%d", &p1, &p2);
		int fau = anc(p1), fav = anc(p2);
		if (fau != fav) {
			printf("-1\n");
			continue;
		}
		ans = 0x3f3f3f3f;
		int Lca = lca(p1, p2);
		printf("%d\n", ans);
	}
	return 0;
}
2020/10/20 23:15
加载中...