小Y的图(kruskal重构树)

题目描述
小Y有一个n个点的无向图,图中的每个点从1到n标号。图中还有m条边,每条边有一个长度。
小Y有Q个询问,每次询问两个点所有路径中,最长的边最小值是多少,若这两个点之间没有任何路径,输出 -1。

输入
第一行三个整数n、m和Q。
接下来m行每行三个整数x、y、z(1≤x,y≤n,1≤z≤1000000),表示有一条连接x和y长度为z的边。
接下来Q行每行两个整数x、y(x≤y),表示一组询问。

输出
Q行每行一个整数,表示一组询问的答案。
样例输入
5 5 4
1 2 3
1 3 2
3 2 1
1 4 5
2 4 4
1 2
1 4
3 5
2 4

样例输出
2
4
-1
4

提示
对于前30%的测试数据,满足1≤n,m,Q≤1000。
对于另外30%的测试数据,保证图联通。
对于100%的测试数据,满足1≤n,m,Q≤300000。
对于100%的测试数据,保证不存在自环,但可能存在重边。
请使用scanf,printf或速度更快的读入输出方式。

思路
对于询问A点与B点之间的最长的边最小值或者是最短的边最长值之类的问题,可以直接利用kruskal重构树来解决

代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define re register
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e6+5;
const int M=105;
const int INF=0x3f3f3f3f;
const ll LINF=1e18;
const ull sed=31;
const ll mod=998244353;
const double eps=1e-6;
const double PI=acos(-1.0);
const double delta=0.993; //降温系数
typedef pair<int,int>P;
typedef pair<double,double>Pd;
typedef pair<ll,int> plt;
typedef pair<ll,ll>pll;
      
template<class T>inline void read(T &x)
{
   
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9') {
   f|=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值