悬关 49pts 不知道错哪里(求求了)
查看原帖
悬关 49pts 不知道错哪里(求求了)
746785
Homework_King楼主2024/5/20 16:51
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1e5 + 5;
const int M = 3e5 + 5;
const ll INF = 1e18;

int n, m, tot, a, b, dep[N], f[N], fa[N][21], Log2[N];
ll c, ANS2, val[N][21], val2[N][21];
vector <pair <int, ll> > G[N];
int ans1; ll ans2, ans3;

struct edge{
	int x, y;
	ll z;
	bool flag;
} e[M];

bool cmp(edge a, edge b){
	return a.z < b.z;
}

int find(int k){
	return f[k] == k ? k : f[k] = find(f[k]);
}

void kruscal(){
	int k = 0;
	for(int i = 1; i <= tot; i++){
		int x = e[i].x, y = e[i].y;
		ll z = e[i].z;
		if(find(x) != find(y)){
			f[find(x)] = find(y);
			ANS2 += z;
			e[i].flag = 1;
			G[x].push_back(make_pair(y, z));
			G[y].push_back(make_pair(x, z));
			if(++k == n - 1) break;
		}
	}
}

void dfs(int u, int F, ll V){
	dep[u] = dep[F] + 1;
	fa[u][0] = F;
	val[u][0] = V;
	for(int i = 0; i < G[u].size(); i++){
		int v = G[u][i].first;
		ll w = G[u][i].second;
		if(v == F) continue;
		dfs(v, u, w);
	}
}

void LCA(int a, int b){
	ans1 = ans2 = 0;
	ans3 = -INF;
	if(dep[a] < dep[b])
		swap(a, b);
	while(dep[a] != dep[b]){
		int qwq = Log2[dep[a] - dep[b]];
		a = fa[a][qwq];
		if(ans2 > val[a][qwq])
			ans3 = max(ans3, val[a][qwq]);
		else if(ans2 < val[a][qwq]){
			ans3 = max(ans2, val2[a][qwq]);
			ans2 = val[a][qwq];
		}
		else
			ans3 = max(ans3, val2[a][qwq]);
	}
	if(a == b){
		ans1 = a;
		return;
	}
	for(int i = 20; i >= 0; i--){
		if(fa[a][i] != fa[b][i]){
			a = fa[a][i];
			b = fa[b][i];
			if(ans2 > val[a][i])
				ans3 = max(ans3, val[a][i]);
			else if(ans2 < val[a][i]){
				ans3 = max(ans2, val2[a][i]);
				ans2 = val[a][i];
			}
			else
				ans3 = max(ans3, val2[a][i]);
			if(ans2 > val[b][i])
				ans3 = max(ans3, val[b][i]);
			else if(ans2 < val[b][i]){
				ans3 = max(ans2, val2[b][i]);
				ans2 = val[b][i];
			}
			else
				ans3 = max(ans3, val2[b][i]);
		}
	}
	ans1 = fa[a][0];
	if(ans2 > val[a][0])
		ans3 = max(ans3, val[a][0]);
	else if(ans2 < val[a][0]){
		ans3 = max(ans2, val2[a][0]);
		ans2 = val[a][0];
	}
	else
		ans3 = max(ans3, val2[b][0]);
	if(ans2 > val[b][0])
		ans3 = max(ans3, val[b][0]);
	else if(ans2 < val[b][0]){
		ans3 = max(ans2, val2[b][0]);
		ans2 = val[b][0];
	}
	else
		ans3 = max(ans3, val2[b][0]);
}

int main(){
	for(int i = 1; i <= 1e5; i++)
		Log2[i] = log2(i);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= m; i++){
		scanf("%d%d%lld", &a, &b, &c);
		if(a == b) continue;
		e[++tot].x = a;
		e[tot].y = b;
		e[tot].z = c;
	}
	sort(e + 1, e + 1 + tot, cmp);
	for(int i = 1; i <= n; i++) f[i] = i;
	kruscal();
	dfs(1, 0, 0);
	for(int i = 1; i <= n; i++)
		for(int j = 0; j <= 20; j++)
			val2[i][j] = -INF;
	for(int j = 1; j <= 20; j++)
		for(int i = 1; i <= n; i++){
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
			if(val[i][j - 1] > val[fa[i][j - 1]][j - 1]){
				val[i][j] = val[i][j - 1];
				val2[i][j] = max(val2[i][j - 1], val[fa[i][j - 1]][j - 1]); 
			}
			else if(val[i][j - 1] < val[fa[i][j - 1]][j - 1]){
				val[i][j] = val[fa[i][j - 1]][j - 1];
				val2[i][j] = max(val[i][j - 1], val2[fa[i][j - 1]][j - 1]);
			}
			else{
				val[i][j] = val[i][j - 1];
				val2[i][j] = max(val2[i][j - 1], val2[fa[i][j - 1]][j - 1]);
			}
		}
	ll ANS = INF;
	for(int i = 1; i <= tot; i++){
		if(!e[i].flag){
			LCA(e[i].x, e[i].y);
			ll w = e[i].z;
			if(w > ans2)
				ANS = min(ANS, ANS2 - ans2 + w);
			else
				ANS = min(ANS, ANS2 - ans3 + w);
		}
	}
	printf("%lld", ANS);
	return 0;
}
2024/5/20 16:51
加载中...