UVA 1395 Slim Span 最小生成树
题意:
给你一个图,让你求这个图中所有生成树中满足题目条件的,这个条件是生成树中最长边与最短边的差值最小。
思路:
根据最小瓶颈生成树的定义:在一个有权值的无向图中,求一个生成树最大边的权值尽量小。首先以K算法做这道题,先给所有边排好序,然后我可以从小到大枚举每一条边作为我所求生成树的最短边(即第一次以最短边求最小生成树,第二次删除第一条边,以第二条边为最短边求最小生成树,第三次删除第一条边和第二条边,以第三边为最短边求最小生成树。)然后在这个过程中更新 MST(maxE- minE)就好了。这么做的原因是:因为最小生成树一定是无向图的瓶颈生成树。即如果最短边(第一条边)已经定下来,那么最小生成树的 (maxE- minE)一定比其他以这个边为最短边的生成树的(maxE - min E)小。所以就可以依次枚举这个最短边,更新答案就好了。
代码:
import java.util.Scanner;
import java.util.Comparator;
import java.util.Arrays; class Node{
public int u, v, w, mark;
}
//结构排序
class mycmp implements Comparator<Node>{
public int compare(Node A, Node B){
return A.w - B.w;
}
}
public class Main {
final static int MAXN = 10000 + 13;
final static int INF = 0x3f3f3f3f;
static int[] pre = new int[MAXN];
static Node[] map = new Node[MAXN];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(true){
int N,M;
N = sc.nextInt();
M = sc.nextInt();
if(N == 0 && M == 0)break;
for(int i = 1; i <= M; i++){
map[i]=new Node();
map[i].u = sc.nextInt();
map[i].v = sc.nextInt();
map[i].w = sc.nextInt();
map[i].mark = 0;
}
met(N);
Arrays.sort(map, 1, M + 1, new mycmp());
int sst = ksu(N, M, 0); //SST 初始化为最小生成树的值
for(int i = 1; i <= M; i++){ //求SST
met(N);
int temp = ksu(N, M, i);//以第 i + 1 条边作为第一条边(即删除前i条边后)求MST,如果不等于 -1 说明构造成功
if(temp < sst && temp != -1){
sst = temp;
}
}
System.out.println(sst);
}
sc.close();
}
public static int ksu(int N, int M,int mark){ //删除 前 mark 条边 求 MST
int cnt= 0;
int st, ed;
st = ed = map[1].w;
boolean flag = true;
for(int i = mark + 1; i <= M; i++){
int fu = Find(map[i].u);
int fv = Find(map[i].v);
if(fu != fv){
if(flag){
st = map[i].w;
flag = false;
}
cnt++;
pre[fv] = fu;
}
if(cnt == N - 1){
ed = map[i].w;
return ed - st;
}
}
return -1;
}
public static int Find(int x){
return x == pre[x] ? x : (pre[x] = Find(pre[x]));
}
public static void debug(int M){
for(int i = 1; i <= M; i++){
System.out.println(i + " " + map[i].u + " " + map[i].v + " " + map [i].w + " "+ map[i].mark);
}
}
public static void met(int N){
for(int i = 1; i <= N; i++){
pre[i] = i;
}
}
}
UVA 1395 Slim Span 最小生成树的更多相关文章
- UVA 1395 Slim Span (最小生成树,MST,kruscal)
题意:给一个图,找一棵生成树,其满足:最大权-最小权=最小.简单图,不一定连通,权值可能全相同. 思路:点数量不大.根据kruscal每次挑选的是最小权值的边,那么苗条度一定也是最小.但是生成树有多棵 ...
- UVa 1395 Slim Span (最小生成树)
题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include ...
- UVa 1395 - Slim Span(最小生成树变形)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 1395 Slim Span【最小生成树】
题意:给出n个节点的图,求最大边减最小边尽量小的值的生成树 首先将边排序,然后枚举边的区间,判定在该区间内是否n个点连通,如果已经连通了,则构成一颗生成树, 则此时的苗条度是这个区间内最小的(和kru ...
- UVA - 1395 Slim Span (最小生成树Kruskal)
Kruskal+并查集. 点很少,按边权值排序,枚举枚举L和R,并查集检查连通性.一旦连通,那么更新答案. 判断连通可以O(1),之前O(n)判的,第一次写的过了,后来T.. #include< ...
- UVa 1395 Slim Span
问题:给出一个n结点的图,求最大边与最小边差值最小的生成树 my code: #include <iostream> #include <cstdio> #include &l ...
- poj 3522 Slim Span (最小生成树kruskal)
http://poj.org/problem?id=3522 Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submissions ...
- POJ 3522 Slim Span 最小生成树,暴力 难度:0
kruskal思想,排序后暴力枚举从任意边开始能够组成的最小生成树 #include <cstdio> #include <algorithm> using namespace ...
- uva1395 - Slim Span(最小生成树)
先判断是不是连通图,不是就输出-1. 否则,把边排序,从最小的边开始枚举最小生成树里的最短边,对每个最短边用Kruskal算法找出最大边. 或者也可以不先判断连通图,而是在枚举之后如果ans还是INF ...
随机推荐
- Visual Studio Emulator for Android 折腾记
想用虚拟机调试Android项目,于是想到了MS免费提供的 Visual Studio Emulator for Android,这玩意价格免费量又足,N久之前试用过,速度杠杠的! 安装包很小,不到4 ...
- shell脚本批量下载资源并保留路径
示例资源列表 如url.txt: http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png http://su.bdimg.co ...
- Python 3基础教程5-while循环语句
本文开始介绍循环语句,和其他编程语言一样,Python中有while循环和for循环,这里介绍while循环. 语法: while 条件表达式为真: 做一些事情 实际生活中有很多这样的循环场景,这里举 ...
- java初学4
1.interface接口 (1)[修饰符] interface 接口名 extends 父接口1,父接口2.... •没有构造方法,不能实例化; •接口只能继承接口,不能 ...
- 【java并发编程实战】第二章:对象的共享
1.重要的属性 可见性,不变性,原子性 1.1可见性 当一个线程修改某个对象状态的时候,我们希望其他线程也能看到发生后的变化. 在没有同步的情况下,编译器和处理器会对代码的执行顺序进行重排.以提高效率 ...
- Java访问修饰符(控制属性或方法在哪些范围内可见)
default:不加控制符的时候,就是default,只能在本包内访问 public:公有的,在本类之外其他类中可以访问,不在本包内也可以访问 private:私有的,在本类之外其他类不能访问 pro ...
- 课时34:丰富的else语句以及简洁的with语句
目录: 一.丰富的else语句 二.简洁的with语句 三.课时34课后习题及答案 *********************** 一.丰富的else语句 ********************** ...
- HttpRuntime.Cache再学习
摘抄: 可以看到:读缓存,其实是在调用Get方法,而写缓存则是在调用Insert方法的最简单的那个重载版本. 注意了:Add方法也可以将一个对象放入缓存,这个方法有7个参数,而Insert也有一个签名 ...
- System.Activator类
public static ObjectHandle CreateInstance(string assemblyName, string typeName); 该类有一个方法. // // 摘要: ...
- web服务器集群session同步
在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...