题意:

  给你一个图,让你求这个图中所有生成树中满足题目条件的,这个条件是生成树中最长边与最短边的差值最小。

思路:

  根据最小瓶颈生成树的定义:在一个有权值的无向图中,求一个生成树最大边的权值尽量小。首先以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;
}
}
}

最新文章

  1. CListBox多选情况处理方法
  2. Web前端开发规范文档(google规范)
  3. 动态调用WCF服务
  4. 结构体buf_block_t
  5. CommonsChunkPlugin的一些总结
  6. MyKTV项目,走起!
  7. Kattis - Aaah!
  8. asp.net C# 题目大全
  9. NOIP 2017 解题报告
  10. MySQL中使用union all获得并集的排序
  11. 爬取QQ音乐(讲解爬虫思路)
  12. Oracle的安装与配置
  13. 微信小程序开发工具常用快捷键
  14. python 回溯法 子集树模板 系列 —— 17、找零问题
  15. [知乎]BAT占线
  16. 数据库迁移工具Navicat Premium之OracleToMysql
  17. 东北林业大学第12届ACM(打表)
  18. Linux系统多网卡绑定实战
  19. 配置文件格式用哪个?文件夹+纯文本文件,XML,SQLite
  20. C# 各种导入 Excel 文件的数据的方法总结

热门文章

  1. +(void)load; +(void)initialize;有什么用处?
  2. 《Cracking the Coding Interview》——第7章:数学和概率论——题目2
  3. iOS笔记053- Quartz2D-练习
  4. maven的一些使用配置!
  5. CandyCrush 糖果传奇
  6. PHP 比较运算符 var_dump(&quot;a&quot; == 0) 为 true
  7. go语言的学习网站
  8. tomcat启动后服务访问404
  9. Error “can&#39;t use subversion command line client : svn” Probably the path to Subversion executable is wrong
  10. Kd-Tree&amp;Ransac笔记