Description

给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。 
图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).

现在有 K个询问 (1 < = K < = 20,000)。 
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Input

第一行: N, M, K。 
第2..M+1行: 三个正整数:X, Y, and D (1 <= X <=N; 1 <= Y <= N). 表示X与Y之间有一条长度为D的边。 
第M+2..M+K+1行: 每行两个整数A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Output

对每个询问,输出最长的边最小值是多少。

Sample Input

6 6 8
1 2 5
2 3 4
3 4 3
1 4 8
2 5 7
4 6 2
1 2
1 3
1 4
2 3
2 4
5 1
6 2
6 1

Sample Output

5
5
5
4
4
7
4
5

HINT

1 <= N <= 15,000

1 <= M <= 30,000

1 <= d_j <= 1,000,000,000

1 <= K <= 15,000

最小生成树+倍增求lca

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=15000+10,maxm=30000+10;
int n,m,k,faf[maxn],tot;
 
struct Node{
    int x,y,d;
    bool operator <(const Node& b) const{return d<b.d;}
}node[maxm];
 
int aa;char cc;
int read() {
    aa=0;cc=getchar();
    while(cc<'0'||cc>'9') cc=getchar();
    while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
    return aa;
}
 
int find(int x) {
    return faf[x]==x? x:faf[x]=find(faf[x]);
}
 
int fir[maxn],to[2*maxn],nxt[2*maxn],val[2*maxn],e=0;
void add(int x,int y,int z) {
    to[++e]=y;nxt[e]=fir[x];fir[x]=e;val[e]=z;
    to[++e]=x;nxt[e]=fir[y];fir[y]=e;val[e]=z;
}
 
int dep[maxn],fa[maxn][20],ans[maxn][20];
void dfs(int pos,int h) {
    dep[pos]=h;
    for(int y=fir[pos];y;y=nxt[y]) {
        if(to[y]==fa[pos][0]) continue;
        fa[to[y]][0]=pos;
        ans[to[y]][0]=val[y];
        dfs(to[y],h+1);
    }
}
 
int mi[20],cha,rs;
int LCA(int x,int y) {
    rs=1;
    if(dep[x]!=dep[y]) {
        if(dep[x]<dep[y]) swap(x,y);
        cha=dep[x]-dep[y];
        for(int i=tot;i>=0;--i) if(cha>=mi[i]) {
            rs=max(rs,ans[x][i]);
            cha-=mi[i]; x=fa[x][i];
            if(!cha) break;
        }
    }
    int xx,yy,d;
    while(x!=y) {
        xx=x;yy=y;d=-1;
        while(xx!=yy) {
            if(d>=0) rs=max(rs,ans[x][d]),rs=max(rs,ans[y][d]);
            x=xx;y=yy;
            xx=fa[x][++d]; yy=fa[y][d];
        }
        if(d==0) rs=max(rs,ans[x][d]),rs=max(rs,ans[y][d]),x=xx,y=yy;
    }
    return rs;
}
 
int main() {
    n=read();m=read();k=read();
    int a,b;
    for(int i=1;i<=m;++i) {
        node[i].x=read();node[i].y=read();node[i].d=read();
    }
    sort(node+1,node+m+1);
    for(int i=1;i<=n;++i) faf[i]=i;
    for(int i=1;i<=m;++i) {
        a=find(node[i].x);b=find(node[i].y);
        if(a!=b) {
            faf[a]=b;tot++;
            add(node[i].x,node[i].y,node[i].d);
        }
        if(tot==n-1) break;
    }
    dfs(1,1); tot=-1;
    for(int i=1;i<n*2;i<<=1) mi[++tot]=i;
    for(int i=1;i<=tot;++i) for(int j=1;j<=n;++j) {
        fa[j][i]=fa[fa[j][i-1]][i-1];
        ans[j][i]=max(ans[j][i-1],ans[fa[j][i-1]][i-1]);
    }
    for(int i=1;i<=k;++i) {
        a=read();b=read();
        printf("%d\n",LCA(a,b));
    }
    return 0;
}

  

bzoj3732 Network(NOIP2013 货车运输)的更多相关文章

  1. [Luogu 1967] NOIP2013 货车运输

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

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

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

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

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

  4. NOIP2013 货车运输

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

  5. Codevs3278[NOIP2013]货车运输

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

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

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

  7. noip2013货车运输

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

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

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

  9. [noip2013]货车运输(kruskal + 树上倍增)

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

随机推荐

  1. PAT甲级——A1026 Table Tennis

    A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...

  2. Maven实战01_Maven简介

    1:何为Maven Maven:中文翻译为"知识的积累",也可翻译为"专家"或"内行". 谈到Maven,就不得不提"构建(bui ...

  3. Java基础程序与面向对象

    首先,我们需要了解和知道一些Java的基本概念: 程序编译过程:.java文件会通过编译器--被编译成一个. class字节码文件---再由虚拟机运行.class文件解释运行Java程序. 编码规范: ...

  4. 利用GitHub来进行团队协作开发项目

    首先: 1.项目组长要在GitHub创建一个仓库 2.组长git clone仓库地址到本地   3.组长在本地克隆到的项目里面创建一个Django项目  4.在当前项目下进行git add以及git ...

  5. Liferay 7:Liferay DXP解决方案

    分享是美德,欢迎探讨技术 这个作者很厉害呀,写的博客都是解决很刁钻问题的.强烈推荐 http://www.liferaysolution.com/2017/06/captcha-recaptcha-w ...

  6. maven-home

    E:/Soft/Maven/apache-maven-3.3.3 E:\Soft\Maven\apache-maven-3.3.3\conf\settings.xml E:\DellWork\Mave ...

  7. leyou_01_环境搭建

    1.乐优商城项目搭建 前端技术: 基础的HTML.CSS.JavaScript(基于ES6标准) JQuery Vue.js 2.0以及基于Vue的框架:Vuetify 前端构建工具:WebPack ...

  8. 微信Web开发者工具报错:net::ERR_BLOCKED_BY_CLIENT

    今天在微信调试琳德的拼团,用了挺久之后,输入什么测试地址:发现页面空白,console提示身份验证网址错误,错误类型为:net::ERR_BLOCKED_BY_CLIENT, 尝试了好多次.以为是我的 ...

  9. REM布局计算,移动端,pc端有兼容性)

    rem布局计算(移动端,pc端有兼容性) <!DOCTYPE html> <html> <head lang="en"> <script& ...

  10. Elasticsearch连接类(带密码)

    /** * 获取ES连接类 * * @author 陈康 * @description * @create 2019/08/15 **/ @Component("ElasticsearchR ...