最小生成树+枚举。
每次试图找出 最舒适的。
把边枚举就好了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXF 0x7fffffff
#define MINF 0x80000000
using namespace std;
int a[201],n,m;
struct lx
{
int a,b,c;
}l[1001];
bool cmp(lx a,lx b)
{
return a.c<b.c;
}
void intset(int n)
{
for(int i=1;i<=n;i++)
a[i]=i;
}
int fa(int x)
{
if(x!=a[x])
return fa(a[x]);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<m;i++)
scanf("%d%d%d",&l[i].a,&l[i].b,&l[i].c);
sort(l,l+m,cmp);
int q;
scanf("%d",&q);
while(q--)
{
int x,y;
int ans=MAXF;
scanf("%d%d",&x,&y);
for(int i=0;i<m;i++)
{
intset(n);
for(int j=i;j<m;j++)
{
int ta=l[j].a,tb=l[j].b;
ta=fa(ta),tb=fa(tb);
if(ta!=tb)a[tb]=ta;
ta=fa(x),tb=fa(y);
if(ta==tb)
{
ans=min(ans,l[j].c-l[i].c);
break;
}
}
}
if(ans==MAXF)
puts("-1");
else printf("%d\n",ans);
}
}
}