唉。。。这题太让我伤心了,看完题之后知道是最小生成树,但是却没想到暴搜,卡了好久,最后是看别人的思路才过的,感觉自己好笨啊!!!
#include"stdio.h" #include"stdlib.h" #define inf 999999 int n,m,fa[105]; struct node { int x,y; int cost; }edge[1005]; int cmp(const void *a,const void *b) { node *aa=(node*)a,*bb=(node*)b; return aa->cost-bb->cost; } int find(int w) { while(w!=fa[w]) w=fa[w]; return w; } int main( ) { int i,a,b,min,q; int s,e,t,j; while(~scanf("%d%d",&n,&m)) { for(i=0;i<m;i++) scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].cost); qsort(edge,m,sizeof(node),cmp); scanf("%d",&q); while(q--) { min=inf; scanf("%d%d",&s,&e); for(i=0;i<m;i++)//从前到后枚举每一条边; { for(j=0;j<=n;j++) fa[j]=j; for(j=i;j<m;j++) { a=find(edge[j].x); b=find(edge[j].y); if(a!=b) fa[b]=a; if(find(s)==find(e))//直到找到一条可以使起点到达终点的边,做差; { t=edge[j].cost-edge[i].cost; if(min>t) min=t; break; } } if(j==m) break; } if(min==inf) printf("-1\n"); else printf("%d\n",min); } } return 0; }