传送门

这道题以前只会树剖和最小生成树+倍增。

而现在学习了一个叫做kruskal" role="presentation" style="position: relative;">kruskalkruskal重构树的优美姿势,搞得我不想写都不行了。

好吧事实上krsukal" role="presentation" style="position: relative;">krsukalkrsukal重构树上两点的lca" role="presentation" style="position: relative;">lcalca就是它们路径上的瓶颈这个优美的性质可以秒杀这道题。

代码如下:

#include<bits/stdc++.h>
#define N 10005
#define M 50005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline void write(int x){
    if(x>0)write(x/10);
    putchar((x%10)^48);
}
int n,m,q,fa[N<<1],son[N<<1][2],w[N<<1],pa[N<<1][20],dep[N<<1];
bool vis[N<<1];
inline int find(int x){return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}
struct Node{int u,v,w;}e[M];
inline bool cmp(Node a,Node b){return a.w>b.w;}
inline void dfs(int p){
    for(int i=1;i<=19;++i)pa[p][i]=pa[pa[p][i-1]][i-1];
    vis[p]=true;
    if(!son[p][0]&&!son[p][1])return;
    dep[son[p][0]]=dep[son[p][1]]=dep[p]+1;
    dfs(son[p][0]),dfs(son[p][1]);
}
inline void kruskal(){
    sort(e+1,e+m+1,cmp);
    int cnt=n;
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=(n<<1);++i)fa[i]=i;
    for(int i=1;i<=m;++i){
        int x=find(e[i].u),y=find(e[i].v);
        if(x!=y){
            pa[x][0]=pa[y][0]=fa[x]=fa[y]=++cnt;
            son[cnt][0]=x,son[cnt][1]=y;
            w[cnt]=e[i].w;
        }
    }
    for(int i=cnt;i>=1;--i)if(!vis[i])dfs(i);
}
inline int lca(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    for(int i=19;i>=0;--i){
        if(dep[pa[x][i]]>=dep[y])x=pa[x][i];
        if(x==y)return x;
    }
    for(int i=19;i>=0;--i)if(pa[x][i]!=pa[y][i])x=pa[x][i],y=pa[y][i];
    return pa[x][0];
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=m;++i)e[i].u=read(),e[i].v=read(),e[i].w=read();
    kruskal();
    q=read();
    while(q--){
        int u=read(),v=read(),x=find(u),y=find(v);
        if(x!=y){puts("-1");continue;}
        printf("%d\n",w[lca(u,v)]);
    }
    return 0;
}

2018.07.22 洛谷P1967 货车运输(kruskal重构树)的更多相关文章

  1. Luogu P1967 货车运输(Kruskal重构树)

    P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...

  2. 洛谷 P1967 货车运输

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

  3. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  4. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  5. NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)

    题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  6. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  7. 洛谷P4197 Peaks (Kruskal重构树)

    读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[ ...

  8. NOI2018 D1T1 洛谷P4768 归程 (Kruskal重构树)

    实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中节点有两个权 ...

  9. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

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

随机推荐

  1. angular 使用服务共享数据需要注意

    在使用服务共享数据时,需要注意一些细节,否则会出现视图不刷新,也不报错这样的问题,遇到了,总结下 如下: <div ng-controller='ctr1'> <a href={{n ...

  2. 浅谈Http、TCP、UDP和 IP 的的区别

    应用层:Http,超文本传输协议(HyperText Transfer Protocal):利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议.客户端使用Web浏览器发起HTTP请求 ...

  3. 机器学习入门-概率阈值的逻辑回归对准确度和召回率的影响 lr.predict_proba(获得预测样本的概率值)

    1.lr.predict_proba(under_text_x)  获得的是正负的概率值 在sklearn逻辑回归的计算过程中,使用的是大于0.5的是正值,小于0.5的是负值,我们使用使用不同的概率结 ...

  4. 拓扑排序获取所有可能序列JAVA实现

    在看算法基础这本书,看到有向无环图,其中介绍到了拓扑排序,讲到了获取拓扑序列的方法,结合自己的理解,用JAVA代码实现了获取所有可能序列,水平有限,效率什么的就没有考虑,下面贴上代码: package ...

  5. jsp常见的指令总结

    一.三个编译指令 1.page指令: 首先,我们要明确一点就是page指令是一个全局指令,针对当前页面,其次我们再来深挖他的功能,它到底有哪些功能那,在我们程序中起到什么作用??? a.语法结构:&l ...

  6. JAVA动态性之一一反射机制reflection

    package com.bjsxt.reflection.test.bean; public class User { private int id; private int age; private ...

  7. one by one 项目 part 5

    问题汇总 一.Can't connect to MySQL server on 'localhost' (10061)翻译:不能连接到 localhost 上的mysql分析:这说明“localhos ...

  8. JS中数组的创建方法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. tensor flow 的两种padding方式

    https://segmentfault.com/a/1190000007846181

  10. 最短路径-Dijkstra算法(转载)

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...