bzoj3732: Network(最小生成树+LCA)
2024-08-31 13:35:31
3732: Network
题目:传送门
题解:
第一眼就看到最大边最小,直接一波最小生成树。
一开始还担心会错,问了一波肉大佬,任意两点在最小生成树上的路径最大边一定是最小的。
那么事情就变得简单起来了嘿嘿嘿,建棵树,直接在线LCA啊,用一个mx[i][j]记录i往上2^j这段区间的最大值。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int x,y,c;
}a[];int len;
void ins(int x,int y,int c)
{
len++;a[len].x=x;a[len].y=y;a[len].c=c;
}
struct edge
{
int x,y,c,next;
}e[];int llen,last[];
void inss(int x,int y,int c)
{
llen++;e[llen].x=x;e[llen].y=y;e[llen].c=c;
e[llen].next=last[x];last[x]=llen;
}
int fa[];
int findfa(int x){if(fa[x]!=x)fa[x]=findfa(fa[x]);return fa[x];}
bool cmp(node n1,node n2){return n1.c<n2.c;}
int n,m,T;
int bin[],dep[],f[][];
int mx[][];//记录i~i+2^j的最大边值
void pre_tree_node(int x)
{
for(int i=;i<= && dep[x]>=bin[i];i++)
f[x][i]=f[f[x][i-]][i-],mx[x][i]=max(mx[x][i-],mx[f[x][i-]][i-]);
for(int k=last[x];k;k=e[k].next)
{
int y=e[k].y;
if(y!=f[x][])
{
dep[y]=dep[x]+;
f[y][]=x;mx[y][]=e[k].c;
pre_tree_node(y);
}
}
}
int sol(int x,int y)
{
int maxx=;
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
if(dep[x]-dep[y]>=bin[i])
maxx=max(maxx,mx[x][i]),x=f[x][i];
if(x==y)return maxx;
for(int i=;i>=;i--)
if(dep[x]>=bin[i] && f[x][i]!=f[y][i])
maxx=max(maxx,max(mx[x][i],mx[y][i])),x=f[x][i],y=f[y][i];
maxx=max(maxx,max(mx[x][],mx[y][]));
return maxx;
}
int main()
{
bin[]=;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
scanf("%d%d%d",&n,&m,&T);
llen=len=;memset(last,,sizeof(last));
for(int i=;i<=m;i++)
{
int x,y,c;scanf("%d%d%d",&x,&y,&c);
ins(x,y,c);ins(y,x,c);
}
sort(a+,a+len+,cmp);
for(int i=;i<=n;i++)fa[i]=i;int tt=;
for(int i=;i<=len;i++)
{
int fx=findfa(a[i].x),fy=findfa(a[i].y);
if(fx!=fy)
{
fa[fy]=fx,tt++;
inss(a[i].x,a[i].y,a[i].c);
inss(a[i].y,a[i].x,a[i].c);
if(tt==n-)break;
}
}
for(int i=;i<=n;i++)
if(fa[i]==i)
f[i][]=,dep[i]=,pre_tree_node(i);
while(T--)
{
int st,ed;scanf("%d%d",&st,&ed);
printf("%d\n",sol(st,ed));
}
return ;
}
最新文章
- shell脚本俄罗斯方块游戏
- [Java入门笔记] 面向对象三大特征之:继承
- Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
- Windows性能监视器之CPU、硬盘、IO等监控方法详解-摘自网络
- Hadoop datanode无法启动的错误
- 记录一次centos升级gblic的教训
- freebsd安装和图形界面安装
- 使用 Spark MLlib 做 K-means 聚类分析[转]
- Codeforce#354_B_Pyramid of Glasses(模拟)
- 利用DNS AAAA记录和IPv6地址传输后门
- Windows 7 蓝屏原因
- input type=";file";指定文件类型为excel
- RxJava 2.x 使用最佳实践
- TCP报文格式
- 46-2016 蓝桥杯 java B 组
- KEIL中函数定义存在但go to definition却不跳转的原因
- centos安装Django之三:安装python
- HDU - 4436sam裸题
- P2P Downloader
- python you-get 下载视频
热门文章
- 2015.05.15,外语,学习笔记-《Word Power Made Easy》 01 “如何讨论人格特点”
- java old GC和young GC
- hdoj--2522--A simple problem(数学模拟)
- ubuntu软件卸载方法
- 基于Redis实现分布式应用限流--转
- Java对象、Json、Xml转换工具Jackson使用
- 列表查询组件代码, 简化拼接条件SQL语句的麻烦
- deploy sql clr
- Pyhton学习——Day27
- js 时间戳 中国标准时间 年月日 日期之间的转换