This article is made by Jason-Cow.
Welcome to reprint.
But please post the writer's address.

http://www.cnblogs.com/JasonCow/

感谢您的关注,赠送数据生成器一个

#include <ctime>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define sizen 10
#define sizem 10
#define sizew 32767
#define sizeq 20
int main(){
freopen("car.in","w",stdout);
srand(time(NULL));
int n=rand()%sizen+,m=rand()%sizem+;
cout<<n<<" "<<m<<endl;
while(m--){
int u=rand()%n+,v=rand()%n+;
if(u==v)u=(u-+n)%n+;
cout<<u<<" "<<v<<" "<<rand()%sizew+<<endl;
}
int q=rand()%sizeq+;
cout<<q<<endl;
while(q--){
int u=rand()%n+,v=rand()%n+;
if(u==v)u=(u-+n)%n;
cout<<u<<" "<<v<<endl;
}
return ;
}

似乎官方给的是倍增lca

不管了,最近练习链剖,以后有时间在补倍增的写法

就是边权下放成点权,然后树链剖分套一颗线段树就可以了

开始sb似的建成一颗大树,其实直接利用Kruskal的并查集查询是否在同一子树就好了[森林x1森林x2森林x3重要的事说三遍]

ac code 莫名压行,不压不爽

 //边权的下放,可能是这题唯一的细节吧
#include <cstdio>
#include <algorithm>
#define E(u,v,w) e[++cnt]=(edge){v,w,head[u]},head[u]=cnt
using namespace std;
int GI(){
int x=,c=getchar(),f=;
while(c<''||c>''){if(c=='-')f=;c=getchar();}
while(c>=''&&c<='')x=x*+c-'',c=getchar();
return f?-x:x;
}
const int maxn=,maxm=;
struct edge{int v,w,next;}e[maxm*];
struct data{int u,v,w;}a[maxm];
int n,m,q,head[maxn],cnt,f[maxn],vis[maxn];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
bool operator<(data x,data y){return x.w>y.w;}
void add(int u,int v,int w){E(u,v,w),E(v,u,w);}
void kruskal(){
sort(a+,a+m+);
for(int i=;i<=n;i++)f[i]=i;
for(int i=,tot=;i<=m;i++){
int u=a[i].u,v=a[i].v;
int x=find(u),y=find(v);
if(x!=y)f[x]=y,add(a[i].u,a[i].v,a[i].w),++tot;
if(tot==n-)return;
}
}
int dfn[maxn],dep[maxn],fa[maxn],top[maxn],son[maxn],rak[maxn],siz[maxn],idx,W[maxn];
void dfs1(int u,int _fa){
siz[u]=,fa[u]=_fa,dep[u]=dep[_fa]+;
for(int i=head[u];i;i=e[i].next)
if(e[i].v!=_fa){
dfs1(e[i].v,u),siz[u]+=siz[e[i].v],W[e[i].v]=e[i].w;//细节1
if(!son[u]||siz[e[i].v]>siz[son[u]])son[u]=e[i].v;
}
}
void dfs2(int u,int _top){
dfn[u]=++idx,rak[dfn[u]]=u,top[u]=_top;
if(son[u])dfs2(son[u],_top);
for(int i=head[u];i;i=e[i].next)
if(e[i].v!=fa[u]&&e[i].v!=son[u])dfs2(e[i].v,e[i].v);
}
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
int Min[maxn<<];
void up(int x){Min[x]=min(Min[ls],Min[rs]);}
void build(int x,int l,int r){
if(l==r)Min[x]=W[rak[l]];
else build(ls,l,mid),build(rs,mid+,r),up(x);
}
int MIN(int x,int l,int r,int L,int R){
if(L>R)return <<;
if(L<=l&&r<=R)return Min[x];
if(R<=mid)return MIN(ls,l,mid,L,R);
if(L>mid)return MIN(rs,mid+,r,L,R);
return min(MIN(ls,l,mid,L,R),MIN(rs,mid+,r,L,R));
}
int jump(int x,int y){
if(find(x)!=find(y))return -;
int ans=<<;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=min(ans,MIN(,,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans=min(ans,MIN(,,n,dfn[x]+,dfn[y]));//细节2
return ans;
}
int main(){
freopen("car.in","r",stdin);
freopen("car.out","w",stdout);
int i;n=GI(),m=GI();
for(i=;i<=m;i++)a[i].u=GI(),a[i].v=GI(),a[i].w=GI();
for(kruskal(),i=;i<=n;i++)if(!dfn[i])dfs1(i,),dfs2(i,i);
for(build(,,n),q=GI(),i=;i<=q;i++)printf("%d\n",jump(GI(),GI()));
return ;
}

链剖-进阶ing-填坑-NOIP2013-货车运输的更多相关文章

  1. [Luogu 1967] NOIP2013 货车运输

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

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

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

  3. [LCA & RMQ] [NOIP2013] 货车运输

    首先看到这题, 由于要最大, 肯定是求最大生成树 那么 o(n2) dfs 求任意点对之间的最小边是可以想到的 但是看看数据范围肯定TLE 于是暴力出来咯, 不过要注意query的时候判断的时候要 m ...

  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. 区块链 编译android geth 填坑记录 ubuntu

    下载geth 源码  直接 make android 下载android ndk sdk 配置环境变量cd 安装golang  设置环境变量 发现没有gomobile命令 按照wiki方法 执行安装g ...

随机推荐

  1. linux常见目录介绍

    /bin:/usr/bin: 可执行二进制文件目录,如常用命令ls.cat /boot: 放置linux启动时用到的一些文件,建议分区的时候独立分区 /dev: 存在linux系统下的设备文件,访问该 ...

  2. vjudge 骨牌覆盖

    原题链接:https://vjudge.net/contest/331993#problem/B 在2*N的一个长方形方格中,用一个1*2的骨牌排满方格. 问有多少种不同的排列方法. 例如:2 * 3 ...

  3. SVM-支持向量机(三)SVM回归与原理

    SVM回归 我们之前提到过,SVM算法功能非常强大:不仅支持线性与非线性的分类,也支持线性与非线性回归.它的主要思想是逆转目标:在分类问题中,是要在两个类别中拟合最大可能的街道(间隔),同时限制间隔侵 ...

  4. 微信小程序scroll-view去除滚动条

    css代码: .father{ //父元素 width: 100vw; height: 100vh; overflow-x: hidden; overflow-y: auto; } //隐藏滚动条 : ...

  5. python2.6升级python2.7后,yum不能用了,如何解决

    背景: 跑python的case时候,发现log功能不好用,于是升级了python2.6-->python2.7 but,升级之后,发现yum命令不好用了.怎么办? 百度搜了一下,如何解决: 参 ...

  6. 申请一个美国paypal账户

    近期为了做PayPal支付,进口demo已经写好,就差一个美国PayPal账户进行支付测试,几经折腾,终于申请下来,附上参考链接:   paypal官网: https://www.paypal.com ...

  7. Java 11 新垃圾回收器 ZGC

    可伸缩.低延迟的垃圾回收器 GC 暂停时间不超过 10ms 堆管理容量范围(小M级别,大到T级别) 对应用吞吐量影响不超过15%(对比 G1) 为进一步的添加新特性和优化做基础 默认支持 Linux/ ...

  8. javacv FFmpeg 视频压缩

    package com.nmcc.demo.utils; import lombok.extern.slf4j.Slf4j; import org.bytedeco.javacpp.avcodec; ...

  9. "const char *" 类型的值不能用于初始化 "char *" 类型的实体

    用vs2019发现会出现这样的问题 最后发现只要设置一下就解决了,解决方案如下: 右击该项目,选择属性->c/c++->语言->将符合模式改为否就行了... 设置之后程序没有再报错, ...

  10. 题解【Codeforces859C】Pie Rules

    题面 一道需要一定思考的 \(\text{DP}\) . 设 \(dp_i\) 表示第 \(i\) 步走的人能得到的最大分数, \(sum_i\) 表示 \(\sum_{j=i}^n a_j\) ,即 ...