UVA 1395 (kruskal)
/*
最大路与最小路的问题:
这道题看似简单,但是若不知道思路将无法写出。
思路:最小生成树很容易求出,但是最大值与最小值只差很难保证是最小的,
比如:1 5 5 6 100 101
很明显101 - 5 < 100 - 1
所以:只需要枚举到m条边的情况就行。
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
class kruskal
{
public:
int a,b,value;
}edge[];
int n,m;
int f[];//并查集
int s[];//根的数目
int ans;
bool cmp(kruskal a,kruskal b)
{
return a.value < b.value;
}
int Find(int x)
{
if(f[x] == x)
return x;
else
f[x] = Find(f[x]);
return f[x];
}
int Union(int x,int y)
{
int a = Find(x);
int b = Find(y);
if(a == b)
return ;
else if(s[a] <= s[b]){ //使用了优化并查集
f[a] = b;
s[b] += s[a];
}
else {
f[b] = a;
s[a] += s[b];
}
return ;
}
int kruskal(int i)
{
int pos = ;
int r;
for( ;i <= m; i++){
if(Union(edge[i].a,edge[i].b)){
pos++;
if(pos == )
r = edge[i].value;
if(pos == n - ){
ans =min(ans,edge[i].value - r);
}
}
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>n>>m){
if(n == && m == )
break;
for(int i = ;i <= m; i++)
cin>>edge[i].a>>edge[i].b>>edge[i].value;
ans = ;
sort(edge+,edge+m+,cmp);
for(int i = ;i <= m - n + ; i++){
for(int j = ;j <= n; j++) {
f[j] = j;
s[j] = ;
}
ans = kruskal(i);
}
if(ans == ){
printf("-1\n");
}
else
printf("%d\n",ans);
}
return ;
}
UVA 1395 (kruskal)的更多相关文章
- UVa 1395 苗条的生成树(Kruskal+并查集)
https://vjudge.net/problem/UVA-1395 题意: 给出一个n结点的图,求苗条度(最大边减最小边的值)尽量小的生成树. 思路: 主要还是克鲁斯卡尔算法,先仍是按权值排序,对 ...
- UVA - 1395 Slim Span (最小生成树Kruskal)
Kruskal+并查集. 点很少,按边权值排序,枚举枚举L和R,并查集检查连通性.一旦连通,那么更新答案. 判断连通可以O(1),之前O(n)判的,第一次写的过了,后来T.. #include< ...
- UVa 1395 - Slim Span(最小生成树变形)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1395 苗条的生成树(最小生成树+并查集)
苗条的生成树 紫书P358 这题最后坑了我20分钟,怎么想都对了啊,为什么就wa了呢,最后才发现,是并查集的编号搞错了. 题目编号从1开始,我并查集编号从0开始 = = 图论这种题真的要记住啊!!题目 ...
- UVa 1395 Slim Span【最小生成树】
题意:给出n个节点的图,求最大边减最小边尽量小的值的生成树 首先将边排序,然后枚举边的区间,判定在该区间内是否n个点连通,如果已经连通了,则构成一颗生成树, 则此时的苗条度是这个区间内最小的(和kru ...
- 【UVA 1395】 Slim Span (苗条树)
[题意] 求一颗生成树,满足最大边和最小边之差最小 InputThe input consists of multiple datasets, followed by a line containin ...
- UVA 1395 Slim Span
题意: 要求的是所有生成树中最大边与最小边差值最小的那个. 分析: 其实可以利用最小瓶颈生成树,就是最小生成树这一性质,枚举原图的最小边,然后找相应生成树的最大边 代码: #include <i ...
- Buy or Build UVA - 1151 Kruskal+枚举
题意: 大概意思是有 n 个点,现在有 q 个方案 ,第 i 个方案耗费为 ci ,使 Ni 个点联通 ,当然也可以直接使两点联通 ,现求最小生成树的代价. 两点直接联通的代价是欧几里得距离的平方: ...
- 【uva 1395】Slim Span(图论--最小生成树+结构体快速赋值 模版题)
题意:给一个N(N<=100)个点的联通图(无自环和平行边),求苗条度(最大边-最小边的值)尽量小的生成树. 解法:枚举+Kruskal.先从小到大排序边,枚举选择的最小的边. 1 #inclu ...
随机推荐
- 循序渐进redis(一) —— redis的安装及可视化工具的使用
1.安装 注意事项: 1.安装gcc 2.编译带参数: make MALLOC=libc 2.可视化客户端工具 推荐使用RedisClient,提供了基本的CRUD以及过期设置等操作的图形化接口,在项 ...
- js中(function(){…})()立即执行函数写法理解
文章摘自https://my.oschina.net/u/2331760/blog/468672?p={{currentPage+1}} 摘要: javascript和其他编程语言相比比较随意,所以j ...
- php反射
反射 //反射查找对象方法所在的文件名.$n_func = new ReflectionMethod($obj,$function);$filepath = $n_func->getFileNa ...
- matlab初学之roundn和round
文章出处: http://evaevazhuxun.blog.sohu.com/154543859.html http://blog.sina.com.cn/s/blog_a4034b2801012o ...
- css3的3D和2D
css3的3D旋转:rorateX():参数为正值时,盒子是围绕x轴,完成从Y轴正方向到Y轴负方向的旋转,视觉上呈现高度上的变化.rorateY():参数为正值时,盒子是围绕Y轴,完成从X轴正方向到X ...
- css display:inline-block 出现空格解决方案
一: 给父元素添加 display: table;(只加这一句在谷歌, safari里可以) 子元素加: display: table-cell(火狐) 两句都加完美解决 二: .nav ul{fon ...
- ubuntu 解决中文zip乱码问题
用到的工具是The Unarchiver项目提供的lsar/unar工具.The Unarchiver项目主页:http://code.google.com/p/theunarchiver/ 安装(1 ...
- Linux中的find(-atime、-ctime、-mtime)指令分析
本篇主要对find -atime(-ctime..mtime)指令的用法.参数.运行情况进行分析 用法: find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} ...
- 绝不在构造和析构函数中调用 virtual 函数
看下面的这段代码,问 print调用的是基类还是派生类的版本? 答案是 基类... 可能大家会很惊讶,print不是virtual function 吗?为什么不是调用派生类的版本呢? 首先,当定义一 ...
- BackTrack5-r3安装用户组-软件中心
所需文件包地址:http://pan.baidu.com/s/1i3ouc9v(64位更新包) 进入BT系统图形模式-将(用户组-软件中心)文件夹改名(a)并拖进BT系统图形桌面-打开BT终端输入:c ...