题目描述
小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|=