uva_1935_Slim Span
题意:给出一个n<100的图,求苗条度最小的生成树,苗条度指生成树最长的边-最短的边
分析:先按照边权进行排序,然后枚举生成树边开始的起点,用kruskal找到终点,每次更新答案
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e4+5; 4 5 int u[maxn],v[maxn],w[maxn],r[maxn]; 6 int n,m,p[105]; 7 8 bool cmp(int a,int b){ 9 return w[a]<w[b]; 10 } 11 12 void init(){ 13 for(int i=0;i<=n;i++) 14 p[i]=i; 15 } 16 17 int find(int x){ 18 return p[x]==x?x:p[x]=find(p[x]); 19 } 20 21 int main(){ 22 while(~scanf("%d%d",&n,&m)&&n+m){ 23 for(int i=0;i<m;i++){ 24 scanf("%d%d%d",u+i,v+i,w+i); 25 r[i]=i; 26 } 27 sort(r,r+m,cmp); 28 int ans=maxn,d; 29 for(int i=0;i<=m-n+1;i++){ 30 init();d=0; 31 for(int j=i;j<m;j++){ 32 int x=find(u[r[j]]); 33 int y=find(v[r[j]]); 34 if(x!=y){ 35 d++; 36 p[x]=p[y]; 37 } 38 if(d==n-1){ 39 ans=min(ans,w[r[j]]-w[r[i]]); 40 break; 41 } 42 } 43 if(d<n-1) 44 break; 45 } 46 printf("%d\n",ans==maxn?-1:ans); 47 } 48 return 0; 49 }