wa 求助
查看原帖
wa 求助
672281
InversionShadow楼主2023/11/25 10:04

重题过了,多测 wa

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 5e4 + 100;

int n, m, tot, num, head[N], fa[N], f[N][20], dis[N][20], depth[N], minn, q, lg[N];
bool vis[N];

struct Edge{
	int to, nxt, k;
} e[N];

struct Node{
	int x, y, z;
	const bool operator < (const Node& e) const {
		return z > e.z;
	}
} a[N];

void add(int x, int y, int z) {
	e[++tot].to = y;
	e[tot].k = z;
	e[tot].nxt = head[x];
	head[x] = tot;
}

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

void dfs(int x, int y, int z) {
	vis[x] = 1;
	depth[x] = depth[y] + 1;
	f[x][0] = y;
	dis[x][0] = z;
	for (int i = 1; (1 << i) <= depth[x]; i++) {
		f[x][i] = f[f[x][i - 1]][i - 1];
		dis[x][i] = min(dis[x][i - 1], dis[f[x][i - 1]][i - 1]);
	}
	
	for (int i = head[x]; i; i = e[i].nxt) {
		if (e[i].to != y) {
			dfs(e[i].to, x, e[i].k);
		}
	}
	return;
}


int LCA(int x, int y) {
	if (find(x) != find(y)) {
		return -1;
	}
	if (depth[x] < depth[y]) {
		swap(x, y);
	}
//	cout << lg[depth[x]] << ' ' << lg[depth[y]] << endl;  
	while (depth[x] > depth[y]) {
		minn = min(minn, dis[x][lg[depth[x] - depth[y]] - 1]);
		x = f[x][lg[depth[x] - depth[y]] - 1];
//		cout << x << endl;
	}
	if (x == y) {
		return minn;
	}
	for (int i = lg[depth[x]] - 1; i >= 0; i--) {
		if (f[x][i] != f[y][i]) {
			minn = min(minn, dis[x][i]);
			minn = min(minn, dis[y][i]);
			x = f[x][i];
			y = f[y][i];
		}
	}
	minn = min(minn, min(dis[x][0], dis[y][0]));
	return minn;
}

signed main() {
	while (cin >> n >> m >> q) {
  	for (int i = 1; i <= m; i++) {
  		cin >> a[i].x >> a[i].y >> a[i].z;
  	}
  	memset(fa, 0, sizeof(fa));
  	tot = 0;
  	memset(e, 0, sizeof(e));
  	num = 0;
  	memset(vis, 0, sizeof(vis));
  	memset(depth, 0, sizeof(depth));
  	memset(dis, 0, sizeof(dis));
  	memset(f, 0, sizeof(f));
  	memset(head, 0, sizeof(head));
  	memset(lg, 0, sizeof(lg));
  	for (int i = 1; i <= n; i++) {
  		fa[i] = i;
  	}
  	sort(a + 1, a + m + 1);
  	for (int i = 1; i <= m; i++) {
  		int nx = find(a[i].x);
  		int ny = find(a[i].y);
  		if (nx == ny) {
  			continue;
  		}
  		fa[nx] = ny;
  		add(a[i].x, a[i].y, a[i].z);
  		add(a[i].y, a[i].x, a[i].z);
  		num++;
  		if (num == n - 1) {
  			break;
  		}
  	}
  	for (int i = 1; i <= n; i++) {
  		if (!vis[i]) {
  			dfs(i, 0, 0);
  		}
  	}
  	for (int i = 1; i <= n; i++) {
  		lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
  	}
  	for (int i = 1; i <= q; i++) {
  		int x, y;
  		cin >> x >> y;
  		minn = 1e9;
  		cout << LCA(x, y) << endl; 
  	}
  }
	return 0;
} 

/*
	10 24 
	4 7 19038 
	7 10 7375 
	7 9 17853 
	9 8 6341 
	7 2 16976 
	10 3 2835 
	10 4 19285 
	9 4 29193 
	3 4 4852 
	3 8 16597 
	9 1 4138 
	9 7 21611 
	7 4 10586 
	10 4 7821 
	10 9 25636 
	3 9 28425 
	2 3 17229 
	4 8 11331 
	9 2 25053 
	6 4 929 
	8 3 1738 
	10 9 28542  
	1 2 28343 
	3 5 13215 
	9 
	7 5 
	2 4 
	10 2 
	5 10 
	7 10 
	4 3 
	10 1 
	10 4 
	8 4 
*/
2023/11/25 10:04
加载中...