题目链接:HDU1598 find the most comfortable road
题意:询问xy所有路径上mx-mn的最小值;
分析:枚举每一条边作为最小生成树的最小边,直到xy连通时更新答案,用当前-最小边更新,有可能会出现将无用边算入答案的情况,但后面会把答案改小,所以不影响;
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=2e5+7;
const int mod=1e9+7;
const int INF=0x7f7f7f7f;
int n,m,u,v,pre[maxn];
struct node{int x,y,z;} p[maxn];
bool cmp(node a,node b) {return a.z<b.z;}
int find(int x) {return (x==pre[x])?x:pre[x]=find(pre[x]);}
void merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy) pre[fx]=fy;
}
int check(int x)
{
int cnt=0;
for(int i=0;i<=n;i++) pre[i]=i;
for(int i=x;i<=m;i++)
{
int xx=p[i].x,yy=p[i].y;
merge(xx,yy);
if(find(u)==find(v)) return p[i].z-p[x].z;
}
return INF;
}
void rua()
{
for(int i=1;i<=m;i++)scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
sort(p+1,p+1+m,cmp);
int q;scanf("%d",&q);
while(q--)
{
int ans=INF;
scanf("%d%d",&u,&v);
for(int i=1;i<=m;i++) ans=min(ans,check(i));
if(ans==INF) ans=-1;
printf("%d\n",ans);
}
}
int main()
{
while(~scanf("%d%d",&n,&m)) rua();
return 0;
}