#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. LinqToExcel常用对象

    1.ExcelQueryFactory对象(1)获取工作表名集合IEnumerable<string> GetWorksheetNames() //获取工作薄中的工作表名 foreach ...

  2. web api写api接口时返回

    web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Applic ...

  3. javascripct导图

    分别归类为: 1 .javascript变量 2. javascript运算符 3. javascript数组 4. javascript流程语句 5. javascript字符串函数 6. java ...

  4. MySQL之count(*)与count(id)效率比较(转)

    优化总结: 1.任何情况下SELECT COUNT(*) FROM tablename是最优选择: 2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = ’ ...

  5. ECSHOP订单一键发货简化订单发货流程

    第一步: 在templates/order_info.htm文件找到: {if $operable_list.confirm}       <input name="confirm&q ...

  6. Win10 IIS以及ASP.NET 4.0配置问题日志

    问题日志 升级到Win10并安装了VS2015后,原有ASP.NET 4.0项目在本机的IIS部署出现问题. 安装IIS: 在[控制面板.程序.启用或关闭Windows功能.Internet Info ...

  7. splay学习笔记

    伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.(来自百科) 伸展树的操作主要是 –rotate(x) 将x旋转到x的父亲的位置 voi ...

  8. Xcode - 必不可少的插件

    1. backLight 2.  BBUDebuggerTuckAway 3. Cocoapod 4. FuzzyAutoComplete 5. HOStringSense 6. KissImageN ...

  9. android开发之---文字居中---android中去掉标题栏

    1. 让textView里面的内容水平居中 :    android:gravity="center_horizontal" 2. 让textView控件在它的父布局里水平居中   ...

  10. CQRS学习——IOC,配置,仓储隔离以及QueryEntry[其三]

    从IoC开始说起 博主最早开始用的IoC容器叫AutoFac,那时候用它主要是为了生命周期管理——将EF上下文的生命周期限定为每请求.当然也总是每每听到IoC的好处,但是仍然不能理解其优势.最近在学习 ...