题意:给N个点,M条边,每个边有相应的权值,然后求出用M条边中的N-1条边形成的树中,边权值最大与最小的差为所有树中最小。

思路:想到了并查集,然后借用克鲁斯卡尔的思想,边排序,再枚举一下即可。

卡了很久,最后才发现是因为初始化并查集的时候N是从0~N-1了,还有就是初始化cMin时,却忘了初始化temp……

用我可怜的小马甲交了N次………

#include <iostream>#include <cstdio>#include <algorithm>#define MAXN 105#define INF 1000000004using namespace std;int father[MAXN];int rank[MAXN];int m, n;struct Edge{int x, y, w;}e[5000];

void makeset()   //并查集初始化

{for(int i=1; i<=n; i++)    {        father[i]=i;        rank[i]=0;    }}

int findsetr(int x)  //非递归找根节点{int r=x;while(r!=father[r])        r=father[r];

int temp;while(x!=r)    {        temp=father[x];        father[temp]=r;        x=temp;    }return r;}

void unionr(int x, int y)  //联合{     x=findsetr(x);    y=findsetr(y);if(x==y)return ;if(rank[x]>rank[y])        father[y]=x;else        father[x]=y;if(rank[x]==rank[y])        rank[y]++;}

int cmp(Edge a, Edge b){return a.w<b.w;}

int main(){while(scanf("%d%d", &n, &m))    {if(!n && !m) break;for(int i=0; i<m; i++)        {            scanf("%d%d%d", &e[i].x, &e[i].y, &e[i].w);

        }if(n==2 && m==1) {printf("0\n");continue;}  //特判

if(m<n-1) {printf("-1\n"); continue;}    //M<N-1必然无法形成树        sort(e, e+m, cmp);  int cMin=INF,temp=INF;           //记得temp也要INF,或者把比较cMin>temp?cMin=temp:cMin;放在for(int j……)里        for(int i=0; i<m-n+2; i++)          //只用0~m-n+2        {            makeset();            //初始化            int k=0;for(int j=i; j<m; j++)            //j=i是最小的边权,当k=n-1时,j表示最大的边权            {int x=findsetr(e[j].x);      int y=findsetr(e[j].y);if(x!=y)            //不是环                {                    k++;                    unionr(x, y);                }if(k==n-1) {temp=e[j].w-e[i].w; break;}//e[i].w表示第一条被选中的边,e[j].w表示最后一条被选中的边            }            cMin>temp?cMin=temp:cMin;        }if(cMin==INF) printf("-1\n");else printf("%d\n", cMin);    }return 0;}

转载于:https://www.cnblogs.com/FreeAquar/archive/2011/06/30/2093919.html

poj 3522 Slim Span相关推荐

  1. POJ 3522 Slim Span (Kruskal枚举最小边)

    题意: 求出最小生成树中最大边与最小边差距的最小值. 分析: 排序,枚举最小边, 用最小边构造最小生成树, 没法构造了就退出 1 #include <stdio.h> 2 #include ...

  2. Slim Span UVA - 1395 (并查集)

    Slim Span UVA - 1395 题目大意: 给出m条边,问使n个节点连成一幅连通图的最大边减去最小边的最小值 思路: 对边按照边权排序,求出在边权从小到大的边序列中连续的可以使点连成图的边的 ...

  3. 洛谷 UVA1395 苗条的生成树 Slim Span

    题目链接 题目描述 求所有生成树中最大边权与最小边权差最小的,输出它们的差值. 题目分析 要求所有生成树中边权极差最小值,起初令人无从下手.但既然要求所有生成树中边权极差最小值,我们自然需要对每一棵生 ...

  4. poj 3522(最小生成树应用)

    题目链接:http://poj.org/problem?id=3522思路:题目要求最小生成树中最大边与最小边的最小差值,由于数据不是很大,我们可以枚举最小生成树的最小边,然后kruskal求最小生成 ...

  5. Poj 3522 最长边与最短边差值最小的生成树

    题意:       让你求一颗生成树,使得最长边和最短边长度差值最小. 思路:      额!!!感觉这个思路会超时,但是ac了,暂时没什么别的好思路,那么就先说下这个思路,大牛要是有好的思路希望能在 ...

  6. Slim Span UVA - 1395

    题意:寻找满足条件的最小生成树,条件是生成树中最长边与最短边的差越小越好. 题解:将边进行排序后,枚举第一条边,然后不断更新答案就行了. 1 #define INF 1e8 2 #include< ...

  7. 【uva 1395】Slim Span(图论--最小生成树+结构体快速赋值 模版题)

    题意:给一个N(N<=100)个点的联通图(无自环和平行边),求苗条度(最大边-最小边的值)尽量小的生成树. 解法:枚举+Kruskal.先从小到大排序边,枚举选择的最小的边. 1 #inclu ...

  8. 【Kruskal】Uva 1395 Slim Span

    这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧! 一.题目大意 题目的大致意思就是要你求一个图的生成树,要保证求解的这棵生成树的边的权值,最大值减去最小值最小,要求输出这个最小值. 二.题目思路 ...

  9. (UVA1395)Slim Span(A)

    どこでもドア: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

最新文章

  1. acitivity 和fragment 通信,使用广播来传递信息的问题
  2. svn 命令行创建和删除 分支和tags
  3. python常用内置模块-Python基础-22常用内置模块
  4. linux带字符的行,linux小计,统计文件中包含指定字符串的行数
  5. datagrip中sqlite3导入csv数据集
  6. 二次重建基本完成辣!
  7. 毕业了去哪里工作,一位毕业多年北漂人的经验感悟
  8. 计算机网络及应用的说课稿,第一课计算机网络及应用说课稿
  9. java计算两列数据差_DAX计算列基于其他表中的两列
  10. Linux基础(13)文本查找利器find的使用方法
  11. JMeter:生成漂亮的多维度的HTML报告
  12. Eigen3卸载与安装
  13. day26 IP查询项目
  14. 转载:大师之间的论战 jQuery之父谈YUI3差在哪
  15. LTP性能测试工具的使用详解
  16. 出版图书二维码,要如何制作呢?
  17. 春节假期收官小记|抢红包黄金时间分析
  18. 如何高效的使用搜索引擎
  19. 生命的意義在你的内心
  20. 国家标准(简称国标)下载备忘

热门文章

  1. QT学习-核心类列表-30、QtSerialPort
  2. BZOJ1856:[SCOI2010]字符串
  3. urlrewrite 保持 posturl
  4. MFC:通过代码简单理解进程间的通讯机制——共享内存
  5. C/C++串口通信原理及读写与操作
  6. python地图 两点距离_没学过还真不会!怎样才能画出准确的地图?
  7. 成都python数据分析师职业技能_想成为数据分析师,需要重点学习什么技能?
  8. java删除通用方法_一个比较通用的java删除文件和文件夹的方法
  9. c语言程序输入n个数字排序,输入n个数字然后进行排序,用C语言编写。注意是n个数啊,不是确定的个数。...
  10. java网页快照_java网页快照-网页转存为图片