poj 3522 Slim Span
题意:给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相关推荐
- POJ 3522 Slim Span (Kruskal枚举最小边)
题意: 求出最小生成树中最大边与最小边差距的最小值. 分析: 排序,枚举最小边, 用最小边构造最小生成树, 没法构造了就退出 1 #include <stdio.h> 2 #include ...
- Slim Span UVA - 1395 (并查集)
Slim Span UVA - 1395 题目大意: 给出m条边,问使n个节点连成一幅连通图的最大边减去最小边的最小值 思路: 对边按照边权排序,求出在边权从小到大的边序列中连续的可以使点连成图的边的 ...
- 洛谷 UVA1395 苗条的生成树 Slim Span
题目链接 题目描述 求所有生成树中最大边权与最小边权差最小的,输出它们的差值. 题目分析 要求所有生成树中边权极差最小值,起初令人无从下手.但既然要求所有生成树中边权极差最小值,我们自然需要对每一棵生 ...
- poj 3522(最小生成树应用)
题目链接:http://poj.org/problem?id=3522思路:题目要求最小生成树中最大边与最小边的最小差值,由于数据不是很大,我们可以枚举最小生成树的最小边,然后kruskal求最小生成 ...
- Poj 3522 最长边与最短边差值最小的生成树
题意: 让你求一颗生成树,使得最长边和最短边长度差值最小. 思路: 额!!!感觉这个思路会超时,但是ac了,暂时没什么别的好思路,那么就先说下这个思路,大牛要是有好的思路希望能在 ...
- Slim Span UVA - 1395
题意:寻找满足条件的最小生成树,条件是生成树中最长边与最短边的差越小越好. 题解:将边进行排序后,枚举第一条边,然后不断更新答案就行了. 1 #define INF 1e8 2 #include< ...
- 【uva 1395】Slim Span(图论--最小生成树+结构体快速赋值 模版题)
题意:给一个N(N<=100)个点的联通图(无自环和平行边),求苗条度(最大边-最小边的值)尽量小的生成树. 解法:枚举+Kruskal.先从小到大排序边,枚举选择的最小的边. 1 #inclu ...
- 【Kruskal】Uva 1395 Slim Span
这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧! 一.题目大意 题目的大致意思就是要你求一个图的生成树,要保证求解的这棵生成树的边的权值,最大值减去最小值最小,要求输出这个最小值. 二.题目思路 ...
- (UVA1395)Slim Span(A)
どこでもドア: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...
最新文章
- acitivity 和fragment 通信,使用广播来传递信息的问题
- svn 命令行创建和删除 分支和tags
- python常用内置模块-Python基础-22常用内置模块
- linux带字符的行,linux小计,统计文件中包含指定字符串的行数
- datagrip中sqlite3导入csv数据集
- 二次重建基本完成辣!
- 毕业了去哪里工作,一位毕业多年北漂人的经验感悟
- 计算机网络及应用的说课稿,第一课计算机网络及应用说课稿
- java计算两列数据差_DAX计算列基于其他表中的两列
- Linux基础(13)文本查找利器find的使用方法
- JMeter:生成漂亮的多维度的HTML报告
- Eigen3卸载与安装
- day26 IP查询项目
- 转载:大师之间的论战 jQuery之父谈YUI3差在哪
- LTP性能测试工具的使用详解
- 出版图书二维码,要如何制作呢?
- 春节假期收官小记|抢红包黄金时间分析
- 如何高效的使用搜索引擎
- 生命的意義在你的内心
- 国家标准(简称国标)下载备忘
热门文章
- QT学习-核心类列表-30、QtSerialPort
- BZOJ1856:[SCOI2010]字符串
- urlrewrite 保持 posturl
- MFC:通过代码简单理解进程间的通讯机制——共享内存
- C/C++串口通信原理及读写与操作
- python地图 两点距离_没学过还真不会!怎样才能画出准确的地图?
- 成都python数据分析师职业技能_想成为数据分析师,需要重点学习什么技能?
- java删除通用方法_一个比较通用的java删除文件和文件夹的方法
- c语言程序输入n个数字排序,输入n个数字然后进行排序,用C语言编写。注意是n个数啊,不是确定的个数。...
- java网页快照_java网页快照-网页转存为图片