#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=1e4+;
const int INF=0x3f3f3f3f;
struct Edge{
int u,v,w,next;
bool operator<(const Edge &rhs)const{
return w>rhs.w;
}
}o[N*],edge[N<<];
int fa[N][],fat[N],head[N],tot,p[N][];
void add(int u,int v,int w){
edge[tot].w=w;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int find(int x){
if(x==fat[x])return x;
return fat[x]=find(fat[x]);
}
int d[N];
void dfs(int u,int f){
d[u]=d[f]+;
fa[u][]=f;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(v==f)continue;
dfs(v,u);
p[v][]=edge[i].w;
}
}
int lca(int u,int v){
int ans=INF;
if(d[u]<d[v])swap(u,v);
for(int t=d[u]-d[v],i=;t;t>>=,++i)
if(t&)ans=min(p[u][i],ans),u=fa[u][i];
if(u==v)return ans;
for(int i=;i>=;--i){
if(fa[u][i]!=-&&fa[u][i]!=fa[v][i]){
ans=min(ans,p[u][i]);
ans=min(ans,p[v][i]);
u=fa[u][i],v=fa[v][i];
}
}
ans=min(ans,p[u][]);
ans=min(ans,p[v][]);
return ans;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;++i){
scanf("%d%d%d",&o[i].u,&o[i].v,&o[i].w);
}
sort(o+,o++m);
for(int i=;i<=n;++i)fat[i]=i,head[i]=-;
int cnt=;
for(int i=;i<=m;++i){
int x=find(o[i].u),y=find(o[i].v);
if(x!=y){
fat[y]=x;
++cnt;
add(o[i].u,o[i].v,o[i].w);
add(o[i].v,o[i].u,o[i].w);
if(cnt>=n-)break;
}
}
memset(p,INF,sizeof(p));
memset(fa,-,sizeof(fa));
for(int i=;i<=n;++i){
if(fat[i]==i){
dfs(i,);
fa[i][]=-;
}
}
for(int j=;(<<j)<=n;++j){
for(int i=;i<=n;++i){
if(fa[i][j-]!=-)
{
fa[i][j]=fa[fa[i][j-]][j-];
p[i][j]=min(p[i][j-],p[fa[i][j-]][j-]);
}
}
}
int q;
scanf("%d",&q);
while(q--){
int u,v;
scanf("%d%d",&u,&v);
if(find(u)!=find(v)){
printf("-1\n");
continue;
}
printf("%d\n",lca(u,v));
}
return ;
}

分析:

看这个就好http://hzwer.com/1344.html 仰慕黄学长

然后刚开始我没想写倍增,想写树剖的,后来一看,树剖勉强应该多一个log,而且代码长

所以倍增大法好

NOIP2013 货车运输 LCA倍增+最大生成树的更多相关文章

  1. NOIP2013货车运输[lca&&kruskal]

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  2. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

  3. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  4. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

  5. NOIP2013 货车运输

    3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...

  6. Codevs3278[NOIP2013]货车运输

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond      题目描述 Description A 国有 ...

  7. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...

  8. noip2013货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  9. P1967 货车运输(倍增LCA,生成树)

    题目链接: https://www.luogu.org/problemnew/show/P1967 题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制, ...

随机推荐

  1. Python3 面向对象

    Class 在Python中,定义类是通过class关键字: class Student(object): pass class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是( ...

  2. SerializableMaplist传递数据

    package com.xjx.data; import java.io.Serializable; import java.util.List; import java.util.Map; /** ...

  3. Sublime Text 3 配置浏览器预览路径 localhost

    原文链接:http://jingyan.baidu.com/article/15622f2419ce79fdfcbea5ea.html 按步骤设置成功!感谢大侠! 以下是原文: Sublime Tex ...

  4. php eval函数用法总结

    可以在php.ini禁止此函数,结果失败了 eval定义和用法  eval() 函数把字符串按照 PHP 代码来计算.  该字符串必须是合法的 PHP 代码,且必须以分号结尾.  如果没有在代码字符串 ...

  5. IIS 10.0 无法安装 URL rewrite重写模块 2.0

    打开注册表编辑器,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp位置 把MajorVersion的值改为9之后,就可以安装了,安装完成之后,再把Major ...

  6. OSG Win7 + VS2015 编译

    1. 准备 建立目标树 OpenSceneGraph-VERSION (VERSION替换为版本号) OpenSceneGraph-VERSION\3rdParty (把依赖库放在此目录) http: ...

  7. 【加密】RSA加密之算法

    RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的. RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥, ...

  8. 微信web开发者工具调试

    微信web开发者工具调试 前几天写了一篇使用fiddler调试微信端页面的,然后博友评论说使用fiddler太麻烦了,推荐使用微信web开发者工具调试微信页面,这两天弄着玩了一下,很强大.这篇文章只是 ...

  9. 通过I2C总线向EEPROM中写入数据,记录开机次数

    没买板子之前,用protues画过电路图,实现了通过i2c总线向EEPROM中写入和读出数据. 今天,在自己买的板子上面写关于i2c总线的程序,有个地方忘了延时,调程序的时候很蛋疼.下面说说我对I2c ...

  10. c++ 输入一行字符串

    ]; //cin>>str1; 方式1 不能统计(录入)空格后的字符 cin.); //方式2 能统计空格后输入的字符 按回车键输入结束 get()会将换行符保存在序列里 //gets(s ...