mxqz,关于我全 boom0 这档事
查看原帖
mxqz,关于我全 boom0 这档事
298549
SIXIANG32楼主2021/12/31 22:42

这不科学/dk
由于我妈着急催我要睡觉然后我毕竟想留个 2021 年的好兆头所以就着急求助了 qwq
(woc 我他妈为什么要做这题)

#include <iostream>
#include <algorithm>
#include <vector>
#define MAXN 300000
#define QWQ cout << "QWQ" << endl;
using namespace std;
int n, m, minnum = 0;

struct node {
	int to, val;
	node(int T, int V) {
		to = T, val = V;
	}
};
vector <node> gra[MAXN + 10];

int fa[MAXN + 10];
struct qwq {
	int x, y, z, qwq;
} edge[MAXN + 10];
bool cmp(qwq &x, qwq &y) {
	return x.z < y.z;
}
int Find(int x) {
	if(x == fa[x]) return x;
	else return fa[x] = Find(fa[x]);
}
void kruskal() {
	int cnt = 0;
	for(int p = 1; p <= n; p++) fa[p] = p;
	sort(edge + 1, edge + m + 1, cmp);
	for(int p = 1; p <= m; p++) {
		int u = edge[p].x, v = edge[p].y;
		int U = Find(u), V = Find(v);
		if(U == V) continue;
		fa[V] = U;
		cnt++, minnum += edge[p].z;
		edge[p].qwq = 1;
		gra[u].push_back(node(v, edge[p].z));
		gra[v].push_back(node(u, edge[p].z)); 
		if(cnt >= n) break;
	}
}

int jump[MAXN + 10][30];
int F[MAXN + 10][30][2];
int de[MAXN + 10];
void dfs(int u, int fa, int ue) {
	de[u] = de[fa] + 1;
	jump[u][0] = fa;
	F[u][0][0] = ue;
	F[u][0][1] = -0x3f3f3f3f;
	//0 最大 1 最小 
	for(int p = 1; p <= 20; p++) {
		jump[u][p] = jump[jump[u][p - 1]][p - 1];
		F[u][p][0] = max(F[u][p][0], F[jump[u][p - 1]][p - 1][0]);
		if(F[u][p][0] == F[jump[u][p - 1]][p - 1][0]) F[u][p][1] = max(F[u][p][1], F[jump[u][p - 1]][p - 1][1]);
		if(F[u][p][0] < F[jump[u][p - 1]][p - 1][0]) F[u][p][1] = max(F[u][p][0], F[jump[u][p - 1]][p - 1][1]);
		if(F[u][p][0] > F[jump[u][p - 1]][p - 1][0]) F[u][p][1] = max(F[u][p][1], F[jump[u][p - 1]][p - 1][0]);
	}
	for(int p = 0; p < gra[u].size(); p++) {
		int v = gra[u][p].to, w = gra[u][p].val;
		if(v != fa) 
			dfs(v, u, w);
	}
}


int solve(int a, int b, int fk) {
	vector <int> qwq; 
	if(a == b) return a;
	if(de[a] < de[b]) swap(a, b);
	for(int p = 20; p >= 0; p--)
		if(de[jump[a][p]] <= de[b]) {
			qwq.push_back(F[a][p][0]);
			qwq.push_back(F[a][p][1]);
			a = jump[a][p];
		}
	
	if(a != b) {
		for(int p = 20; p >= 0; p--)
			if(jump[a][p] != jump[b][p]) {
				qwq.push_back(F[a][p][0]);
				qwq.push_back(F[a][p][1]);
				qwq.push_back(F[b][p][0]);
				qwq.push_back(F[b][p][1]);
				a = jump[a][p], b = jump[b][p];
			}
		qwq.push_back(F[a][0][0]);
		qwq.push_back(F[b][0][0]);
	}
	
	int d1 = -0x3f3f3f3f, d2 = -0x3f3f3f3f + 1;
	for(int p = 0; p < qwq.size(); p++) {
		int w = qwq[p];
		if(w > d1) d1 = w;
		if(w > d2 && w != d1) d2 = w;
	}
	if(fk == d1) return minnum - d2 + fk;
	if(fk > d1) return minnum - d1 + fk;
	return -0x3f3f3f3f;
}

void init() {
	cin >> n >> m;
	for(int p = 1; p <= m; p++)
		cin >> edge[p].x >> edge[p].y >> edge[p].z, edge[p].qwq = 0;
	kruskal();
	dfs(1, 0, -0x3f3f3f3f);
	int maxn = 0x3f3f3f3f, ans = -0x3f3f3f3f + 1;
	for(int p = 1; p <= m; p++) {
		if(!edge[p].qwq) {
			int w = solve(edge[p].x, edge[p].y, edge[p].z); 
			if(w < maxn) maxn = w;
		}
	}
	cout << maxn << endl;
}
int main() {
	init();
}

代码略长,希望巨佬不吝赐教 qwq

2021/12/31 22:42
加载中...