题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598
解题思路:
详见代码及注释。
AC代码:
1 #include <algorithm> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int maxn=205,maxm=1005,inf=0x7ffffff; 6 struct edge{ 7 int u,v,spe; 8 }es[maxm]; 9 int n,m; 10 int fa[maxn]; 11 bool cmp(edge &a,edge &b){ 12 return a.spe<b.spe; 13 } 14 int finds(int x){ 15 if(x==fa[x]) return x; 16 return fa[x]=finds(fa[x]); 17 } 18 int main(){ 19 int Q,a,b; 20 while(scanf("%d%d",&n,&m)==2){ 21 for(int i=0;i<m;i++) 22 scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].spe); 23 sort(es,es+m,cmp); //对每一条边根据限速从小到大进行排序 24 scanf("%d",&Q); 25 while(Q--){ 26 scanf("%d%d",&a,&b); 27 int ans=inf; 28 for(int i=0;i<m;i++){ //外层循环从限速最小的那条边开始遍历,此时的最小速度即为这个 29 bool can=false; 30 for(int j=1;j<=n;j++) fa[j]=j; 31 for(int j=i;j<m;j++){ //内层循环 32 edge e=es[j]; 33 int t1=finds(e.u),t2=finds(e.v); //并查集 34 if(t1!=t2){ 35 fa[t1]=t2; 36 if(finds(a)==finds(b)){//一旦使得a和b相连,记录下此时的舒适度,并更新ans,退出内层循环 37 ans=min(ans,es[j].spe-es[i].spe); 38 can=true; 39 break; 40 } 41 } 42 } 43 if(!can||ans==0) break; //如果ans=0(没有办法更好)或者a和b无法联通(最小速度没有办法更大),退出外层循环 44 } 45 if(ans==inf) printf("-1 "); 46 else printf("%d ",ans); 47 } 48 } 49 return 0; 50 }