zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    ural(Timus) 1019 Line Painting
    ACMICPC Live Archive 2031 Dance Dance Revolution
    poj 3321 Apple Tree
    其他OJ 树型DP 选课
    poj 3548 Restoring the digits
    ACMICPC Live Archive 3031 Cable TV Network
    递归循环获取指定节点下面的所有子节点
    手动触发asp.net页面验证控件事件
    子级Repeater获取父级Repeater绑定项的值
    没有列名的数据绑定
  • 原文地址:https://www.cnblogs.com/acSzz/p/2680836.html
Copyright © 2011-2022 走看看