P1967 [NOIP2013 提高组] 货车运输
时间:2021-05-30
本文章向大家介绍P1967 [NOIP2013 提高组] 货车运输,主要包括P1967 [NOIP2013 提高组] 货车运输使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
"Doctor,你这水平下降的有点。。。"
'"我怎么知道能手残写了个return p"
很显然,那条路径一定在最大生成树上,然后在这条树上跑LCA即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct e{
int to;
int ne;
int v;
int st;
int f;
}ed[500010],e2[500010];
int n,m;
int x,y,z;
int fa[500010];
int head[500010];
int vis[500001];
int p;
int dep[500010];
int logg[500010];
int ff[500010][50];
int p1;
int md[500010][50];
void add(int f,int to,int v){
p++;
ed[p].to=to;
ed[p].v=v;
ed[p].f=f;
return ;
}
void add1(int f,int to,int v){
p1++;
e2[p1].ne=head[f];
e2[p1].to=to;
e2[p1].v=v;
head[f]=p1;
return ;
}
bool cmp(e x,e y){
return x.v>y.v;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void kr(){
for(int i=1;i<=n;++i){
fa[i]=i;
}
sort(ed+1,ed+m+1,cmp);
int num=0;
for(int i=1;i<=m;i++){
int u=find(ed[i].to);
int v=find(ed[i].f);
if(u!=v){
add1(ed[i].f,ed[i].to,ed[i].v);
add1(ed[i].to,ed[i].f,ed[i].v);
fa[u]=v;
if(++num==n)
return ;
}
}
}
void dfs(int now,int fr,int vv){
// cout<<now<<" s"<<dep[fr]+1<<endl;
dep[now]=dep[fr]+1;
vis[x]=1;
ff[now][0]=fr;
md[now][0]=vv;
for(int i=1;(1<<i)<=dep[now];++i){
ff[now][i]=ff[ff[now][i-1]][i-1];
md[now][i]=min(md[now][i-1],md[ff[now][i-1]][i-1]);
}
for(int i=head[now];i;i=e2[i].ne){
if(e2[i].to!=fr){
dfs(e2[i].to,now,e2[i].v);
}
}
}
int q;
int lca(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
int znx=210000000;
// cout<<dep[x];
while(dep[x]>dep[y]){
//cout<<dep[x]-dep[y];
znx=min(znx,md[x][logg[dep[x]-dep[y]]-1]);
x=ff[x][logg[dep[x]-dep[y]]-1];
// cout<<"log"<<logg[dep[x]-dep[y]];
// cout<<endl<<dep[x]-dep[y];
}
if(x==y)
return znx;
// cout<<343243432;
for(int k=logg[dep[x]]-1;k>=0;k--){
if(ff[x][k]!=ff[y][k]){
znx=min(znx,md[x][k]);
znx=min(znx,md[y][k]);
x=ff[x][k];
y=ff[y][k];
}
}
return znx=min(znx,min(md[x][0],md[y][0]));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
kr();
for(int i=1;i<=n;++i){
logg[i]=logg[i-1]+(1<<logg[i-1]==i);
}
for(int i=1;i<=n;++i){
// cout<<i<<endl;
if(!vis[i]){
dfs(i,0,0);
}
}
scanf("%d",&q);
for(int i=1;i<=q;++i){
scanf("%d%d",&x,&y);
if(find(x)!=find(y)){
cout<<-1<<endl;
} else{
cout<<lca(x,y)<<endl;
}
}
return 0;
}
原文地址:https://www.cnblogs.com/For-Miku/p/14828921.html
- JavaWeb项目架构之Kafka分布式日志队列
- 如何让Git记住用户名和密码
- 金融系统中正确的金额计算及存储方式
- 如何利用深度学习写诗歌(使用Python进行文本生成)
- 注意:字符串substring方法在jkd6,7,8中的差异。
- JavaWeb项目架构之NFS文件服务器
- 轻松几步搞定SSH连接Git配置
- 免费使用谷歌GPU资源训练自己的深度模型
- Git安装及配置5分钟快速教程
- 风格迁移原理及tensorflow实现-附代码
- 手把手教你搭建目标检测器-附代码
- JavaWeb项目架构之FastDFS分布式文件系统
- JavaWeb项目架构之Redis分布式日志队列
- 超快速!10分钟入门Keras指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RabbitMQ 最常用的 3 大模式!
- 啥?HashMap 1.8 还有死循环?你逗我呢!
- 他写的东西,你们喜欢么?
- 告诉你一个 AtomicInteger 的惊天大秘密!
- 001--算法之"高手过招"[分治算法专题]
- 快速入门使用tikz绘制深度学习网络图
- 后端服务慢成狗?试试这 7 招!
- 高性能无锁并发框架 Disruptor,太强了!
- Spring Boot 太狠了,一口气发布了 3 个版本!
- 贷款违约预测-Task2 数据分析
- Redis 最牛实践:业务层面和运维层面优化!
- 一个 randomkey 命令导致的 Redis 事故。。
- 分布式锁(数据库、Redis、ZK)拍了拍你
- 贷款违约预测-Task3 特征工程
- 用SQL代替DSL查询ElasticSearch怎样?