poj 3522 Slim Span (最小生成树 的 一个性质 kruskal 的 应用 )

http://poj.org/problem?id=3522

题意:

求 最大边和最小边的 差值 最小的 生成树 ;

首先求出 所有的 生成树 肯定 不行; 

 

对于 最小生成树 有 这样的性质

当最小边的权值固定时,最小生成树的最大边的权值也“命中注定”是固定的;

而且 其他的生成树的最大边(最小边 固定 的 情况下)必然也是大于等于最小生成树的最大边;

所以 我们可以  枚举 最小边  ,求  最小生成树 ,更新 解;

 

 


 

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<set>
  7 #include<map>
  8 #include<queue>
  9 #include<vector>
 10 #include<string>
 11 #define Min(a,b) a<b?a:b
 12 #define Max(a,b) a>b?a:b
 13 #define CL(a,num) memset(a,num,sizeof(a));
 14 #define eps  1e-12
 15 #define inf 100000000
 16 
 17 
 18 const double pi  = acos(-1.0);
 19 const int  maxn = 110;
 20 typedef   __int64  ll;
 21 using namespace std;
 22 
 23  //freopen("data.txt","r",stdin);
 24 struct node
 25 {
 26     int x;
 27     int y;
 28     int w;
 29 }p[maxn*maxn] ;
 30 int num ,mx,mi,n,m,f[maxn];
 31 int cmp(node a,node b)
 32 {
 33     return a.w < b.w ;
 34 }
 35 int find(int x)
 36 {
 37     if(x != f[x]) f[x] = find(f[x]);
 38     return f[x] ;
 39 }
 40 void init()
 41 {
 42     int i ;
 43     for(i = 0  ; i <= n;i++)f[i] = i ;
 44 
 45     num = 0 ;
 46     mx = -inf ;
 47     mi = inf ;
 48 
 49 }
 50 int  solve()
 51 {
 52     int i ,j ;
 53     int ans = inf ;
 54     for(i = 0 ; i < m;i++)
 55     {
 56         init() ;
 57         for(j = i ;j < m;j++)
 58         {
 59             int a = find(p[j].x) ;
 60             int b = find(p[j].y);
 61             if(a!=b)
 62             {
 63                 f[a] = b;
 64                 num++;
 65                 if(mx < p[j].w )mx = p[j].w;
 66                 if(mi >  p[j].w) mi = p[j].w ;
 67 
 68                 if(num == n - 1){break ;}
 69             }
 70 
 71         }
 72 
 73         if(num == n-1)
 74         {
 75             if(ans > mx - mi) ans = mx - mi ;
 76 
 77 
 78             if(ans == 0return 0;
 79         }
 80         else return  ans ;
 81 
 82 
 83     }
 84     return ans ;
 85 }
 86 int main()
 87 {
 88     //freopen("data.txt","r",stdin);
 89      int i ;
 90 
 91     while(scanf("%d%d",&n,&m),n+m)
 92     {
 93         for(i = 0 ;i < m;i++)
 94         {
 95             scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].w);
 96 
 97         }
 98         sort(p,p+m,cmp);
 99 
100         int ans  = inf ;
101         ans = solve() ;
102         if(ans == inf)printf("-1\n");
103         else printf("%d\n",ans) ;
104 
105     }
106 }
posted @ 2012-09-11 21:16  Szz  阅读(190)  评论(0编辑  收藏  举报