找一条路,使路径中结点权最小和最大的差最小。
按权值从小到大排序,枚举起点终点,并查集判断要求的起点终点是否连通。
哎 好多麻烦题 就暴力暴力着思路就出来了
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll __int64
using namespace std;
int r[210],n,m;
struct node
{
int s,e,w;
}v[1010];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int root(int a)
{
if(r[a]==a) return a;
r[a]=root(r[a]);
return r[a];
}
void merge(int a,int b)
{
int ra,rb;
ra=root(a);
rb=root(b);
if(ra==rb) return ;
if(ra<rb) r[ra]=rb;
else r[rb]=ra;
}
int main()
{
int i,j,x,y,ans,q;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<m;i++)
scanf("%d%d%d",&v[i].s,&v[i].e,&v[i].w);
sort(v,v+m,cmp);
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&x,&y);
ans=inf;
for(i=0;i<m;i++)
{
for(j=0;j<=n;j++)
r[j]=j;
for(j=i;j<m;j++)
{
merge(v[j].s,v[j].e);
if(root(x)==root(y))
{
if(v[j].w-v[i].w<ans)
ans=v[j].w-v[i].w;
break;
}
}
}
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
}
return 0;
}