思路:对所有路径的速度从小到大排个序,然后枚举高度差就ok......
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define M 1<<30 struct node { int v1,v2; int dis; }s[2000]; int father[2000]; int find(int x) { while(x!=father[x]) x=father[x]; return x; } int cmp(const node a,const node b) { if(a.dis<b.dis) return 1; else return 0; } int main() { int n,m; while(scanf("%d%d",&n,&m)>0) { for(int i=0;i<m;i++) { scanf("%d%d%d",&s[i].v1,&s[i].v2,&s[i].dis); } sort(s,s+m,cmp); int q; scanf("%d",&q); while(q--) { int tmp,tmp1; int minx=M; scanf("%d%d",&tmp,&tmp1); for(int i=0;i<m;i++) { for(int k=0;k<=n;k++) father[k]=k; for(int j=i;j<m;j++) { int x=find(s[j].v1); int y=find(s[j].v2); if(x!=y) father[x]=y; if(find(tmp)==find(tmp1)) { if(minx>(s[j].dis-s[i].dis)) { minx=s[j].dis-s[i].dis; } break; } } } if(minx>=M) printf("-1 "); else printf("%d ",minx); } } return 0; }