这不科学/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