【LCA+MST】BZOJ3732-Network
【题目大意】
给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。图中有M条边 (1<=M<=30,000) ,第j条边的长度:d_j (1<=d_j <=1,000,000,000)。现在有 K个询问 (1 < = K < = 15,000), 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?
【思路】
显然,最小的最长边应该在MST上。先跑出MST,然后对于每个询问跑LCA,在跑LCA的过程中顺便处理最长边。
LCA处理最长边是第一次写,但是这种东西,yy一下就好了,和LCA里面的祖先数组长得是一样的啊……
【错误点】
LCA是最后a的父亲,所以我们还要比较一下a和它父亲的连边……
#include<bits/stdc++.h>
using namespace std;
const int MAXN=+;
const int MAXM=+;
const int DEG=;
struct Edge
{
int u,v,w;
bool operator < (const Edge &x) const
{
return w<x.w;
};
};
Edge edge[MAXM];
vector<Edge> E[MAXN];
int n,m,k;
int u[MAXN],h[MAXN];
int dep[MAXN],anc[MAXN][DEG],maxlen[MAXN][DEG]; void addedge(int u,int v,int w)
{
E[u].push_back((Edge){u,v,w});
E[v].push_back((Edge){v,u,w});
} int find(int x)
{
int r=x;
while (u[r]!=r) r=u[r];
int tmp;
while (u[x]!=x)
{
tmp=u[x];
u[x]=r;
x=tmp;
}
return r;
} void union_set(int fa,int fb)
{
if (h[fa]>=h[fb])
{
u[fb]=fa;
if (h[fa]==h[fb]) h[fa]++;
}
else u[fa]=fb;
} void dfs(int u,int fa,int d)
{
anc[u][]=fa;
dep[u]=d;
for (int i=;i<E[u].size();i++)
{
int to=E[u][i].v;
if (to==fa) continue;
maxlen[to][]=E[u][i].w;
dfs(to,u,d+);
}
} void getanc()
{
for (int i=;i<DEG;i++)
for (int j=;j<=n;j++)
{
anc[j][i]=anc[anc[j][i-]][i-];
maxlen[j][i]=max(maxlen[j][i-],maxlen[anc[j][i-]][i-]);
}
} int swim(int x,int H,int &ret)
{
for (int i=;H>;i++)
{
if (H&) ret=max(ret,maxlen[x][i]),x=anc[x][i];//swim过程中不要忘记更新ret
H/=;
}
return x;
} int lca(int a,int b)
{
int ret=-;
if (dep[a]<dep[b]) swap(a,b);
a=swim(a,dep[a]-dep[b],ret);
if (a==b) return ret;
for (int i=DEG-;i>=;i--)
{
if (anc[a][i]!=anc[b][i])
{
ret=max(ret,maxlen[a][i]);
a=anc[a][i];
ret=max(ret,maxlen[b][i]);
b=anc[b][i];
}
}
ret=max(ret,maxlen[a][]);//最后一条和父亲的连边不要忘记
ret=max(ret,maxlen[b][]);
return (ret);
} void init()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=m;i++)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
for (int i=;i<=n;i++) u[i]=i,h[i]=;
} void kruskal()
{
sort(edge+,edge+m+);
for (int i=;i<=m;i++)
{
int a=edge[i].u,b=edge[i].v;
int fa=find(a),fb=find(b);
if (fa!=fb)
{
union_set(fa,fb);
addedge(edge[i].u,edge[i].v,edge[i].w);
}
}
} void query()
{
dfs(,,);
getanc();
for (int i=;i<k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",lca(a,b));
}
} int main()
{
init();
kruskal();
query();
return ;
}
【LCA+MST】BZOJ3732-Network的更多相关文章
- 【kruscal】【最小生成树】【块状树】bzoj3732 Network
跟去年NOIP某题基本一样. 最小生成树之后,就变成了询问连接两点的路径上的权值最大的边. 倍增LCA.链剖什么的随便搞. 块状树其实也是很简单的,只不过每个点的点权要记录成“连接其与其父节点的边的权 ...
- 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)
[LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...
- 【洛谷】【lca+结论】P3398 仓鼠找sugar
[题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...
- 【LCA/tarjan】POJ1470-Closest Common Ancestors
[题意] 给出一棵树和多组查询,求以每个节点为LCA的查询数有多少? [错误点] ①读入的时候,注意它的空格是随意的呀!一开始不知道怎么弄,后来看了DISCUSS区大神的话: 询问部分输入: scan ...
- 【LCA倍增】POJ1330-Nearest Common Ancestors
[知识点:离线算法&在线算法] 一个离线算法,在开始时就需要知道问题的所有输入数据,而且在解决一个问题后就要立即输出结果. 一个在线算法是指它可以以序列化的方式一个个的处理输入,也就是说在开始 ...
- 【poj 1962】Corporative Network(图论--带权并查集 模版题)
P.S.我不想看英文原题的,但是看网上题解的题意看得我 炒鸡辛苦&一脸懵 +_+,打这模版题的代码也纠结至极了......不得已只能自己翻译了QwQ . 题意:有一个公司有N个企业,分成几个网 ...
- 【UVA 10369】 Arctic Network (最小生成树)
[题意] 南极有n个科研站, 要把这些站用卫星或者无线电连接起来,使得任意两个都能直接或者间接相连.任意两个都有安装卫星设备的,都可以直接通过卫星通信,不管它们距离有多远. 而安装有无线电设备的两个站 ...
- 【35.86%】【POJ 1962】Corporative Network
Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 3943 Accepted: 1414 Description A very bi ...
- 【LCA&倍增】货物运输 @upcexam5909
时间限制: 1 Sec 内存限制: 128 MB 题目描述 在一片苍茫的大海上,有n座岛屿,岛屿与岛屿之间由桥梁连接,所有的岛屿刚好被桥梁连接成一个树形结构,即共n-1架桥梁,且从任何一座岛屿出发都能 ...
随机推荐
- docker mysql authentication_string client does not support authentication 连接问题
docker安装mysql后,本地navicat连接报错client does not support authentication 解决办法: 1. docker ps -a 查找到容器id 2. ...
- 质数——6N±1法
6N±1法求素数 任何一个自然数,总可以表示成为如下的形式之一: 6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…) 显然,当N≥1时,6N,6N+2,6N+3,6N+4都 ...
- windows下非管理员权限安装mysql
windows下,mysql有两种安装方式: 1.msi安装 2.zip安装 无论是哪种安装方式,都因为需要将mysql安装为一个服务,所以必须要以管理员权限安装. 因为公司的换了虚拟机,无法取得管理 ...
- fastJson顺序遍历JSON字段(转)
fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用L ...
- go语言学习之路(一)Hello World
为什么要使用 Go 语言?Go 语言的优势在哪里? 1.部署简单. 2.并发性好. 3.良好的语言设计. 4.执行性能好. Go环境搭建 Golang下载 国外镜像 https://www.gola ...
- AngularJS入门基础——控制器
AngularJS中的控制器是一个函数,用来向视图的作用域添加额外的功能.我们用它来给作用域对象设置初始状态,并添加自定义行为. AngularJS同其他JavaScript框架最主要的一个区别就是, ...
- Hibernate常用的Java数据类型映射到mysql和Oracle
研究了常用的Java基本数据类型在mysql和oracle数据库的映射类型.这里使用的是包装类型做研究,一般在hibernate声明的时候最好不要用基本类型,因为数据库中的null空数据有可能映射为基 ...
- springcloud配置详解
Spring Boot的配置参考Spring Boot系列文章,这里只对Spring Cloud用到的配置解释. spring.application.name:配置应用名称,在注册中心中显示的服务注 ...
- 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- http跨域时的options请求
1.背景 在前后端分离的项目中经常会遇到跨域请求的问题,如果没有进行跨域配置,会浏览器请求失败.我一般采用两种解决方案: 1.采用nginx进行转发,是前后端服务处于同一个域下面,从根本上避免跨域问题 ...