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 }
  • 相关阅读:
    PHP写一段代码,确保多个进程同时写入一个文件成功
    PHP中的中文截取乱码问题_gb2312_utf-8
    TortoiseSVN使用详细步骤
    限制页面内部链接访问源-HTML注释
    Redis配置文件解读
    window下部署php_redis扩展
    js延迟加载,提升网页加载速度
    HTML5 LocalStorage 本地存储
    静态HTML页面不缓存js文件的方法
    寻找幸运数
  • 原文地址:https://www.cnblogs.com/acSzz/p/2680836.html
Copyright © 2011-2022 走看看