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\n",gao(x,y));
    }
    return 0;
}
时间: 2024-10-13 10:41:58

qwb与学姐的相关文章

qwb与学姐 (带秩并查集)

qwb与学姐 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 149  Solved: 54[Submit][Status][Web Board] Description qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:已知一幅n个点m条边的无向图,定义路径的值为这条路径上最短的边的长度,现在有 k个询问,询问从A点到B点的所有路径的值的最大值.qwb听完这个问题很绝望啊,聪明的你能帮帮他吗? Input 一组数据.第一行三

2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运算(模二意义下0.1互换,注意前导0也要交换),然后在任意相邻的两个数之间插入二进制与.二进制或,或者二进制异或.现在他想知道这样计算完产生的最美妙的数字是多少. 一共T组数据.对于每组数据,第一行一个n,表示这组数据中一串数有多少个.下面n个非负整数,表示这串数. 样例输入 2 2 3 6 3 1

Vijos1901 学姐的钱包

描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位朋友说:如果doc有不少于Ri元钱,doc可以把手上所有的钱都给这位朋友,并从这位朋友手中换回Vi元钱,但是这次交换会浪费Ti的时间.doc希望可以在最短的时间内换到M元钱(其实是可以大于M的, 因为doc可以存私房钱呢), 否则学姐会生气的! 格式 输入格式 输入数据第一行给定T, 表示总的询问次

卿学姐与魔法(优先队列)

个人心得:思路很简单,不过就是会超时,而且直接用数组的话肯定不够大. 所以就用优先队列,让里面只装N个数就好了,然后再次添加时进行比较,比他小就放进去. 不过这样超时,所以先将A,B排序,然后只要比队首大就break就可以过了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<queue> 6 #include<

A - 卿学姐与公主(线段树+单点更新+区间极值)

A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王的第一道城关. 在这个城关面前的是魔王的精锐部队,这些士兵

vijosP1903学姐的实习工资

描述 学姐去实习了, 一共实习了N天, 每一天都可以得到实习工资V[i], 这里V[1..N]被看作是整数序列.因为学姐很厉害, 所以V[1..N]是不下降的.也就是说学姐每天的工资只会越来越多, 不会变少.然而遗憾的是, 偷懒的学姐只记下来了其中M天的收入.第A[1]天获得了的工资为B[1].第A[2]天获得了的工资为B[2].第A[3]天获得了的工资为B[3]....第A[M]天获得了的工资为B[M].其中A[]是递增的.好在她记下来了第一天和第N天的收入. 也就是说A[1]=1, A[M]

hdu1344卿学姐种美丽的花

地址:http://acm.uestc.edu.cn/#/problem/show/1344 题目: 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)     Memory Limit: 125535/65535KB (Java/Others) Submit Status 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一样美丽的花.所以卿学姐家的后院有很多的花坛. 卿学姐有nn个花坛,一开始第ii个花坛里有A[i]A[i]朵花.每过一段

hdu1341卿学姐与城堡的墙

地址:http://acm.uestc.edu.cn/#/problem/show/1341 题目: 卿学姐与城堡的墙 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 卿学姐终于来到了魔王的城堡,城堡修建的十分壮观. 即使心中放不下公主,卿学姐还是忍不住驻足观赏这宏伟的建筑. 卿学姐注意到城堡的墙上有若干直线状的花纹. 可以将墙看做一个平面,卿学姐想

hdu1324卿学姐与公主

地址:http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王