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. 自定义Redux

    实现mini版redux 1. 理解redux模块 1). redux模块整体是一个对象模块 2). 内部包含几个函数 createStore(reducers) // reducers: funct ...

  2. [AtCoder Code Festival 2017 QualB C/At3574] 3 Steps - 二分图染色,结论

    给你一个n个点m条边的无向图,进行以下操作 如果存在两个点u和v,使得从u走三步能恰好到达v,那么在u和v之间连接一条边 重复这个操作直到不能再连接新的边,问最后有多少条边? n, m <= 1 ...

  3. 获取table中CheckBox选中行的id

    方式一 var selectList=''; jQuery(".table tbody input[type=checkbox]:checked").map(function () ...

  4. Selenium3+python自动化013-操作浏览器的Cookie

    为什么要用Cookie?在测试多个页面时候可绕过验证码输入,直接添加cookie,也可以在添加唯一标识时候使用. 一.操作浏览器的Cookie 1.1.验证码的处理方式 说明:WebDriver类库中 ...

  5. Linux - mysql 异常: ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists

    问题描述 ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists 解决方案 删除:/var/lock/su ...

  6. mac或windows下Navicat Premium安装

    找了很多地址都乱七八糟的说明一通还没啥用,好不容易找到一个靠谱的,记录一下,也方便一下和我一样苦苦寻找的人,亲测有用 https://www.52pojie.cn/thread-727433-1-1. ...

  7. 用C#调用外部DLL

    1.有时候需要用C#调用外部的dll,例如c++写的dll,首先需要保证dll的编译环境与本项目的环境是相同的,例如都是x86位或者x64位 2.调用声明和dll内的声明一致: function Te ...

  8. OpenShift 4.3环境中创建基于Go的Operator

    详细步骤可以参考官方文档 https://docs.openshift.com/container-platform/4.3/operators/operator_sdk/osdk-getting-s ...

  9. python itertool 浅谈迭代工具

    1.概述 Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertools提供的几个“无限”迭代器: import itertools natuals ...

  10. 番外:克隆本地PDB中其他参数和子句的说明

    基于版本:19c (12.2.0.3) AskScuti 创建方法:克隆本地PDB(从本地其他PDB创建新的PDB) 对应路径:Creating a PDB --> Cloning --> ...