题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 210
#define M 1010
#define inf 0x3f3f3f3f
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int per[N],n,m,s,t;
int ans;
struct Edge {
int s,e,speed;
} edge[M];
int cmp(Edge a,Edge b) {
return a.speed <b.speed;
}
int find(int x) {
while(x!=per[x]) x=per[x];
return x;
}
int main() {
while(scanf("%d%d",&n,&m)!=EOF) {
int i,j;
for(i=0; i<m; i++)
scanf("%d%d%d",&edge[i].s,&edge[i].e,&edge[i].speed);
sort(edge,edge+m,cmp);
int q;
scanf("%d",&q);
while(q--) {
scanf("%d%d",&s,&t);
int minn=inf;
for(i=0; i<m; i++) { //枚举
for(j=1; j<=n; j++)
per[j]=j;
for(j=i; j<m; j++) {
int fx=find(edge[j].s);
int fy=find(edge[j].e );
if(fx!=fy)
per[fy]=fx;
if(find(s)==find(t)) {
minn=min(minn,edge[j].speed-edge[i].speed );
break;
}
}
}
if(minn==inf)
puts("-1");
else printf("%d\n",minn);
}
}
}