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 }
View Code

 

posted @ 2016-02-16 10:38  N维解析几何  阅读(230)  评论(0编辑  收藏  举报