• qwb与学姐


    qwb与学姐

    Time Limit: 1 Sec  Memory Limit: 128 MB

    Description

    qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:
    已知一幅n个点m条边的无向图,定义路径的值为这条路径上最短的边的长度,
    现在有 k个询问,
    询问从A点到B点的所有路径的值的最大值。
    qwb听完这个问题很绝望啊,聪明的你能帮帮他吗?

    Input

    一组数据。
    第一行三个整数n,m,k (1<=N<=50000,m<=200000,k<=100000)。
    第2..m+1行:三个正整数:X, Y, and D (1 <= X <=N; 1 <= Y <= N,1<=D<=215) 表示X与Y之间有一条长度为D的边。 
    第m+2..m+k+1行: 每行两个整数A B(1<=A,B<=n且A≠B),意义如题目描述。
    保证图连通。

    Output

    对于每个询问输出一行,一共k行,每行输出A点到B点的所有路径的值的最大值。

    Sample Input

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

    Sample Output

    6
    7
    7
    分析:题目要求从A到B所有路径中权值最小值的最大值;
       我们可以考虑构建一棵最大生成树,这样保证了最大值,然后问题变为A到B求路径上最小值;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <bitset>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <cassert>
    #include <ctime>
    #include<unordered_map>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define sys system("pause")
    const int maxn=5e4+10;
    const int N=5e2+10;
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;}
    int n,m,k,t,fa[20][maxn],mi[20][maxn],p[maxn],dep[maxn];
    int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
    struct node
    {
        int x,y,z;
        bool operator<(const node&p)const
        {
            return z>p.z;
        }
    }e[maxn<<2];
    vector<pii>f[maxn];
    void dfs(int x,int y)
    {
        dep[x]=dep[y]+1;
        fa[0][x]=y;
        for(int i=1;fa[i-1][fa[i-1][x]];i++)
        {
            fa[i][x]=fa[i-1][fa[i-1][x]];
            mi[i][x]=min(mi[i-1][x],mi[i-1][fa[i-1][x]]);
        }
        for(int i=0;i<f[x].size();i++)
        {
            int z=f[x][i].fi,w=f[x][i].se;
            if(z==y)continue;
            mi[0][z]=w;
            dfs(z,x);
        }
    }
    int gao(int x,int y)
    {
        int ret=1e9;
        if(dep[x]<dep[y])swap(x,y);
        for(int i=19;i>=0;i--)if(dep[fa[i][x]]>=dep[y])ret=min(ret,mi[i][x]),x=fa[i][x];
        if(x==y)return ret;
        for(int i=19;i>=0;i--)
        {
            if(fa[i][x]!=fa[i][y])
            {
                ret=min(ret,mi[i][x]);
                ret=min(ret,mi[i][y]);
                x=fa[i][x];
                y=fa[i][y];
            }
        }
        ret=min(ret,mi[0][x]);
        ret=min(ret,mi[0][y]);
        return ret;
    }
    int main()
    {
        int i,j;
        scanf("%d%d%d",&n,&m,&k);
        rep(i,1,m)
        {
            scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
        }
        rep(i,1,n)p[i]=i;
        sort(e+1,e+m+1);
        int cnt=0;
        rep(i,1,m)
        {
            int x=find(e[i].x),y=find(e[i].y);
            if(x!=y)
            {
                p[x]=y;
                f[e[i].x].pb(mp(e[i].y,e[i].z));
                f[e[i].y].pb(mp(e[i].x,e[i].z));
                if(++cnt==n-1)break;
            }
        }
        dfs(1,0);
        while(k--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d
    ",gao(x,y));
        }
        return 0;
    }
  • 相关阅读:
    javascript中万恶的function
    Windows7下如何安装部署秋色园CYQBlog源码V1.0网站
    Extjs2.2:Panel里面嵌入Excel表格
    Extjs做界面很酷;感谢博客园给我一个展示的机会;借此向大家展示一下EXTJS的魅力
    16Aspx.com改进版Extjs简单版酒店管理系统提供下载!
    Ext2.2+ASP.NET开发框架已完成欢迎大家下载!
    Extj+Asp.net开发框架V1.1树的操作
    Ext2.2程序开发实战(1)登录界面
    扩展欧几里得定理
    C语言 统计整数二进制表示中1的个数
  • 原文地址:https://www.cnblogs.com/dyzll/p/6934884.html
Copyright © 2020-2023  润新知