题意:求解一个图中生成树最大边与最小边的最小差值
思路:循环去掉小边求残图的最小生成树,求得最小生成树的最长边与最短边的最小差值就是答案,容易证明与最小边差值最小的生成树最大边必然在最小生成树中。

1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 #define inf 0x3f3f3f3f 7 #define N 110 8 #define M N*N 9 struct edge{ 10 int a,b,w; 11 }e[M]; 12 int f[N]; 13 int comp(const void *a,const void *b) 14 { 15 return ((edge *)a)->w>((edge *)b)->w?1:-1; 16 } 17 int find(int x) 18 { 19 if(f[x]==x||f[x]==0)return x; 20 f[x]=find(f[x]); 21 return f[x]; 22 } 23 int main() 24 { 25 int n,m; 26 while(scanf("%d%d",&n,&m)) 27 { 28 int min0=inf; 29 if(n==0&&m==0)break; 30 for(int i=0;i<m;i++) 31 scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w); 32 qsort(e,m,sizeof(edge),comp); 33 for(int i=0;i<=m-n+1;i++) 34 { 35 int c=0; 36 memset(f,0,sizeof(f)); 37 for(int j=i;j<m;j++) 38 { 39 int a0=find(e[j].a); 40 int b0=find(e[j].b); 41 if(a0==b0)continue; 42 else { 43 f[a0]=b0; 44 c++; 45 if(c==n-1){min0=min(min0,e[j].w-e[i].w);break;} 46 } 47 } 48 if(c<n-1)break; 49 } 50 if(min0<inf)printf("%d\n",min0); 51 else printf("-1\n"); 52 } 53 return 0; 54 } 55 56 关闭提示 关闭 57 确 认 取 消