[NOIP2015 提高组] 运输计划 - 洛谷
核心思路
树上二分答案。答案这个字眼很重要,因为,二分出来的就是答案。
拟合经验++。
AC 代码
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn = 300000 + 10;
const int maxl = 20;
int n, m, fa[maxn], dep[maxn], f[maxn][maxl], d[maxn], maxv, cnt;
long long dis[maxn];
vector<pair<int, int>> g[maxn];
struct PATH {
int u, v, dis, lca;
} path[maxn];
bool cmp(PATH &a, PATH &b) {
return a.dis > b.dis;
}
void dfs(int x, int pa) {
fa[x] = pa;
dep[x] = dep[pa] + 1;
for(auto pr : g[x]) {
int y = pr.first;
int w = pr.second;
if(y != pa) {
dis[y] = dis[x] + w;
dfs(y, x);
}
}
}
int lca(int u, int v) {
if(dep[u] < dep[v]) swap(u, v);
int diff = dep[u] - dep[v];
for(int i = 0; i < maxl; i++) {
if(diff >> i & 1) u = f[u][i];
}
if(u == v) return u;
for(int i = maxl - 1; i >= 0; i--) {
if(f[u][i] != f[v][i]) {
u = f[u][i];
v = f[v][i];
}
}
return fa[u];
}
void dfs2(int x, int fa, int w) {
for(auto pr : g[x]) {
int y = pr.first;
int z = pr.second;
if(y != fa) {
dfs2(y, x, z);
d[x] += d[y];
}
}

最低0.47元/天 解锁文章
195

被折叠的 条评论
为什么被折叠?



