题目:http://acm.hdu.edu.cn/showproblem.php?pid=1598
先排序,i 一定为最小权值边,j 一定为最大边,找差值最小
kruskal生成树过程中,start和end连通即可停止,在 i 的循环里找出最小差值。
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int inf=999999999;
int n,m,q,fa[210];
struct edge{
int x,y,len;
}e[1010];
bool cmp(edge a,edge b){
return a.len<b.len;
}
int find(int x){
return fa[x] != x ? fa[x] = find(fa[x]) : x;
}
int solve(int a,int b){
int minn=inf;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)
fa[j]=j;
for(int j=i;j<=m;j++){
int t1=find(e[j].x);
int t2=find(e[j].y);
if(t1!=t2)
fa[t2]=t1;
if(find(a)==find(b)){
minn = min(minn, e[j].len-e[i].len); //
break;
}
}
}
if(minn==inf)
minn=-1;
return minn;
}
int main(){
int i,j,a,b,t;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].len);
sort(e+1,e+m+1,cmp);
scanf("%d",&t);
while(t--){
scanf("%d%d",&a,&b);
printf("%d\n",solve(a,b));
}
}
return 0;
}