zoukankan      html  css  js  c++  java
  • 1519 过路费

    1519 过路费

     

     时间限制: 1 s
     空间限制: 256000 KB
     题目等级 : 大师 Master
     
     
     
    题目描述 Description

        在某个遥远的国家里,有 n个城市。编号为 1,2,3,…,n。这个国家的政府修建了m 条双向道路,每条道路连接着两个城市。政府规定从城市 S 到城市T需要收取的过路费为所经过城市之间道路长度的最大值。如:A到B长度为 2,B到C 长度为3,那么开车从 A经过 B到C 需要上交的过路费为 3。
        佳佳是个做生意的人,需要经常开车从任意一个城市到另外一个城市,因此他需要频繁地上交过路费,由于忙于做生意,所以他无时间来寻找交过路费最低的行驶路线。然而, 当他交的过路费越多他的心情就变得越糟糕。 作为秘书的你,需要每次根据老板的起止城市,提供给他从开始城市到达目的城市,最少需要上交多少过路费。

    输入描述 Input Description

        第一行是两个整数 n 和m,分别表示城市的个数以及道路的条数。 
        接下来 m 行,每行包含三个整数 a,b,w(1≤a,b≤n,0≤w≤10^9),表示a与b之间有一条长度为 w的道路。
        接着有一行为一个整数 q,表示佳佳发出的询问个数。 
        再接下来 q行,每一行包含两个整数 S,T(1≤S,T≤n,S≠T), 表示开始城市S 和目的城市T。

    输出描述 Output Description

        输出共q行,每行一个整数,分别表示每个询问需要上交的最少过路费用。输入数据保证所有的城市都是连通的。

    样例输入 Sample Input

    4 5 
    1 2 10 
    1 3 20 
    1 4 100 
    2 4 30 
    3 4 10 

    1 4 
    4 1

    样例输出 Sample Output

    20 
    20

    数据范围及提示 Data Size & Hint

    对于 30%的数据,满足 1≤ n≤1000,1≤m≤10000,1≤q≤100; 
    对于 50%的数据,满足 1≤ n≤10000,1≤m≤10000,1≤q≤10000; 
    对于 100%的数据,满足 1≤ n≤10000,1≤m≤100000,1≤q≤10000;

    分类标签 Tags 点此展开 

     
     
    lca+mst 最小值最大--寻找 最短路径中的单个最大边的长度
    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define N 400100
    int fa[N],head[N],next[N],tot=0;
    int dep[N],par[N],dist[N];
    struct node{
        int u,v,w;
    }e[N],l[N];
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    void build(int u,int v,int w){
        l[++tot].v=v;
        l[tot].w=w;
        next[tot]=head[u];
        head[u]=tot;
    }
    void dfs(int f,int parent,int de,int dis){
        par[f]=parent;//记录当前点的最近父节点 
        dist[f]=dis;//记录当前点的单边的边权值 
        dep[f]=de;//记录当前点的深度 
        for(int i=head[f];i;i=next[i]){
            int v=l[i].v;//寻找方向 
            if(v!=parent)//爆搜出树的深度 
                dfs(v,f,de+1,l[i].w);
        }    
    }
    int lca(int f,int t){
        int ans=0;
        while(dep[f]>dep[t])
          ans=max(ans,dist[f]),f=par[f];
        while(dep[f]<dep[t])
          ans=max(ans,dist[t]),t=par[t];
        /*尽量保持f,t同一深度*/ 
        while(f!=t){//f,t一起往上找 
          ans=max(ans,dist[f]);
          ans=max(ans,dist[t]);
          f=par[f];
          t=par[t];
        } 
        return ans;
    }
    bool cmp(node a,node b){
        return a.w<b.w;
    }
    int main()
    {
        //freopen("sh.in","r",stdin);
        int n,m,q;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
        sort(e+1,e+m+1,cmp);
        for(int i=1;i<=m;i++){
            int x=find(e[i].u);
            int y=find(e[i].v);
            if(x!=y){
                fa[x]=y;
                build(e[i].u,e[i].v,e[i].w);
                build(e[i].v,e[i].u,e[i].w);
            }
        }
        dfs(1,0,0,0);//遍历出深度 
        scanf("%d",&q);
        for(int i=1,from,to;i<=q;i++){
            scanf("%d%d",&from,&to);
            printf("%d
    ",lca(from,to));
        }
        return 0;
    }
  • 相关阅读:
    第一章 简介(待续)
    第十六章 漫话网站架构师(待续)
    第十五章 网站架构师职场攻略(待续)
    第十四章 架构师领导艺术(待续)
    第十三章 大型网站典型故障分析案例(待续)
    上帝造题的七分钟2/花神游历各国/GSS4 线段树维护区间开方 By cellur925
    LuoguP1606 [USACO07FEB]荷叶塘Lilypad Pond 【最短路】By cellur925
    NOIp2013 车站分级 【拓扑排序】By cellur925
    NOI题库--盒子和小球系列 By cellur925
    关于对动态规划的思考 【转】
  • 原文地址:https://www.cnblogs.com/shenben/p/5474926.html
Copyright © 2011-2022 走看看