bzoj 3732: Network 树上两点边权最值
http://www.lydsy.com/JudgeOnline/problem.php?id=3732
首先想到,要使得最长边最短,应该尽量走最短的边,在MST上。
然后像LCA那样倍增娶个最大值
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = + ;
struct Edge {
int u, v, w, tonext;
bool operator < (const struct Edge & rhs) const {
return w < rhs.w;
}
} e[maxn], t[maxn];
int first[maxn], num;
void addEdge(int u, int v, int w) {
e[num].u = u, e[num].v = v, e[num].w = w, e[num].tonext = first[u];
first[u] = num++;
}
int tfa[maxn];
int tofind(int u) {
if (tfa[u] == u) return u;
else return tfa[u] = tofind(tfa[u]);
}
const int need = ;
int mx[maxn][];
int ansc[maxn][], deep[maxn], fa[maxn]; //所有只需初始值,不需要初始化。
void init_LCA(int cur) { //1 << 20就有1048576(1e6)了。
ansc[cur][] = fa[cur]; //跳1步,那么祖先就是爸爸
if (cur != ) {
for (int i = first[fa[cur]]; ~i; i = e[i].tonext) {
int v = e[i].v;
if (v == cur) {
mx[cur][] = e[i].w;
break;
}
}
}
int haha = mx[cur][];
for (int i = ; i <= need; ++i) { //倍增思路,递归处理
ansc[cur][i] = ansc[ansc[cur][i - ]][i - ];
mx[cur][i] = mx[ansc[cur][i - ]][i - ];
mx[cur][i] = max(mx[cur][i], haha);
haha = max(haha, mx[cur][i]); //上到极限的时候需要取个路经的最大值。
}
for (int i = first[cur]; ~i; i = e[i].tonext) {
int v = e[i].v;
if (v == fa[cur]) continue;
fa[v] = cur;
deep[v] = deep[cur] + ;
init_LCA(v);
}
}
int LCA(int x, int y) {
int res = ;
if (deep[x] < deep[y]) swap(x, y); //需要x是最深的
for (int i = need; i >= ; --i) { //从大到小枚举,因为小的更灵活
if (deep[ansc[x][i]] >= deep[y]) { //深度相同,走进去就对了。就是要去到相等。
res = max(res, mx[x][i]);
x = ansc[x][i];
}
}
if (x == y) return res;
for (int i = need; i >= ; --i) {
if (ansc[x][i] != ansc[y][i]) { //走到第一个不等的地方,
res = max(res, mx[x][i]);
res = max(res, mx[y][i]);
x = ansc[x][i];
y = ansc[y][i];
}
}
res = max(res, mx[x][]);
res = max(res, mx[y][]);
return res; //再跳一步就是答案
} void work() {
num = ;
memset(first, -, sizeof first);
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i <= n; ++i) tfa[i] = i;
for (int i = ; i <= m; ++i) {
scanf("%d%d%d", &t[i].u, &t[i].v, &t[i].w);
}
sort(t + , t + + m);
int sel = ;
for (int i = ; i <= m; ++i) {
if (sel == n - ) break;
int x = tofind(t[i].u), y = tofind(t[i].v);
if (x == y) continue;
sel++;
tfa[y] = x;
addEdge(t[i].u, t[i].v, t[i].w);
addEdge(t[i].v, t[i].u, t[i].w);
}
fa[] = , deep[] = ;
init_LCA();
// printf("%d\n", mx[2][1]);
for (int i = ; i <= k; ++i) {
int u, v;
scanf("%d%d", &u, &v);
printf("%d\n", LCA(u, v));
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}
bzoj 3732: Network 树上两点边权最值的更多相关文章
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- BZOJ 3732: Network 最小生成树 倍增
3732: Network 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 &l ...
- BZOJ 3732 Network 【模板】kruskal重构树
[题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...
- [bzoj 3732] Network (Kruskal重构树)
kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...
- BZOJ 3732 Network
2016.1.28 纪念我BZOJ第一题 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= ...
- BZOJ 3732 Network Link-Cut-Tree (我是认真的!!
题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 LCT的裸题! 首先维护一个动态的最小生成树,然后每次增加边时删除两点间路径上权值最大的边.最后询问时直接求x到y ...
- bzoj 3732 Network(最短路+倍增 | LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3732 [题意] 给定一个无向图,处理若干询问:uv路径上最长的边最小是多少? [思路一 ...
- 【刷题】BZOJ 3732 Network
Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_ ...
- BZOJ 3732 Network —— 最小生成树 + 倍增LCA
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...
随机推荐
- Poj_1002_java解决
一.Description 电话号码的标准格式是七位十进制数,并在第三.第四位数字之间有一个连接符.电话拨号盘提供了从字母到数字的映射,映射关系如下: A, B, 和C 映射到 2 D, E, 和F ...
- Excel特殊格式的列
1.根据前两列显示天时分格式,算出所需时间列的内容=DAY(O2-N2)&"天"&HOUR(O2-N2)&"小时"&MINUTE ...
- linux日常管理-xarge_exec
在find搜索到文件之后再进行操作 exec是find的一个选项. {}表示前面搜索到的结果,\:是exec特殊的用法. xarge拥有同样的功能,需用选项 -i 可以用在其他命令的后面
- T-SQL 高级编程
在Sql Server 中访问数据库一般有2种方式: 1.一种是使用应用程序编程接口API 2.数据库语句 变量:局部变量:以@为前缀,如@Age:全局变量以@@为前缀:(Ps:全局变量以系统定义和维 ...
- sharepoint 2013 创建母版页
一.创建新的母版页, 并添加了新的样式表 1.从CodePlex 上获得Starter Master Pages for SharePoint 2010 或复制以下母版代码 <%@Master ...
- JAVA类,变量的赋值一个小细节,以及static标注变量的意义
在JAVA类中方法外部定义的变量,如果定义的时候没有赋值,那么在方法外也不能对其进行赋值,否则报错,只能放入某一个方法内对其赋值.(为何报错待晚些时候深入查找补充) static标注的变量称为静态变量 ...
- [51nod1058]求N!的长度
法1:stirling公式近似 $n! \approx \sqrt {2\pi n} {(\frac{n}{e})^n}$ (如果怕n不够大下式不成立,可以当数小于10000时用for求阶层) 也可以 ...
- R语言简单作图
以下函数只为满足常用的若干作图需求. 基本作图: plot(x).plot(x, y) #散点图,最多两个变量 #可使用参数type生成不同的效果图.常用'l'.'o'.'h',分别为折线图, ...
- Note: Eleos: ExitLess OS Services for SGX Enclaves
Eleos increased I/O and memory intensive SGX program execution performance with In-enclave system ca ...
- 从阿里中台战略看企业IT架构转型之道
此文是我阅读<企业IT架构转型之道>一书的学习笔记,所有内容出自钟华老师的这本书. 零.为何读<企业IT架构转型之道> 在加入X公司后,开始了微服务架构的实践,也开始了共享平台 ...