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 ...
随机推荐
- 超简单的js数字验证
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...
- 自定义javascript log方法
/** * 类似chrome,firefox的console对象 * 但是在IE等不支持console的浏览器不会报错 * 理论上浏览器支持的console的方法都支持,比如谷歌的 * assert, ...
- Java 中Iterator 、Vector、ArrayList、List 使用深入剖析
标签:Iterator Java List ArrayList Vector 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些 ...
- 对ToString("X2 ")的理解
/// <summary> /// 将byte型转换为字符串 /// </summary> /// <param name=&q ...
- SQLserver CASE WHEN
declare @shuzu int set @shuzu=1 select (case @shuzu when '1' then '444' when '2'then '555' end) as ' ...
- C#对Dictionary的按Value排序
使用List对其进行排序 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp ...
- Integer Break(Difficulty: Easy)
题目: Given a positive integer n, break it into the sum of at least two positive integers and maximize ...
- 各种url编码
URLENCODE和URLDECODE是比较常用的URL参数转换方法,为以后使用方便,自己归类一下. 一.JavaScript: 编码:encodeURIComponent(URIString) ...
- Android深度探索--HAL与驱动开发----第六章读书笔记
Linux驱动程序与其他类型的Linux程序一样拥有自己的规则,下面给出一个编写基本的Linux驱动的一般步骤: (1)建立Linux驱动的骨架(装载和卸载Linux驱动): (2)注册和注销设备文件 ...
- django进行model字段的自定义
相信大家一定有web应用被攻击的经历,数据库安全是一个网站的必须课.django有很好的orm,但sql注入,或其他方式的攻击都是无法完全屏蔽的. 所以一般数据库都会对用户数据,如text类型的数据进 ...