解题思路
一条路上的差值也就是最大值与最小值之差(废话),我们可以枚举最小的边,然后求使其最后连通的最小的边与我们枚举的边的差值的最小值就行了。
代码
const int maxn = 2e2+10;
const int maxm = 1e3+10;
struct E {
int u, v, w;
} e[maxm];
int n, m, p[maxn];
int find(int x) {
return p[x]==x ? p[x] : find(p[x]);
}
int main() {
while(~scanf("%d%d",&n,&m)) {
for (int i = 0; i<m; ++i) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e,e+m,[](E a, E b) {return a.w<b.w;});
int q; scanf("%d",&q);
while(q--) {
int st, ed, ans = INF; scanf("%d%d",&st,&ed);
for (int i = 0; i<m; ++i) {
for (int j = 1; j<=n; ++j) p[j] = j;
for (int k = i; k<m; ++k) {
if (find(e[k].u)!=find(e[k].v))
p[find(e[k].u)] = find(e[k].v);
if (find(st)==find(ed)) {
ans = min(ans, e[k].w-e[i].w);
break;
}
}
}
printf("%d
", ans==INF?-1:ans);
}
}
return 0;
}