问题描述

  C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛。两个小岛间可能存在多座桥连接。然而,由于海水冲刷,有一些大桥面临着不能使用的危险。

如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了。然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事。但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起抗议。

现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们会有多少天进行抗议。

输入格式

  输入的第一行包含两个整数n, m,分别表示小岛的个数和桥的数量。

  接下来m行,每行三个整数a, b, t,分别表示该座桥连接a号和b号两个小岛,能使用t天。小岛的编号从1开始递增。

输出格式

  输出一个整数,表示居民们会抗议的天数。

样例输入

4 4

1 2 2

1 3 2

2 3 1

3 4 3

样例输出

2

样例说明

  第一天后2和3之间的桥不能使用,不影响。

  第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。

  第三天后3和4之间的桥不能使用,居民们会抗议。

数据规模和约定

  对于30%的数据,1<=n<=20,1<=m<=100;

  对于50%的数据,1<=n<=500,1<=m<=10000;

  对于100%的数据,1<=n<=10000,1<=m<=100000,1<=a, b<=n, 1<=t<=100000。

说一下此题题意的理解问题:首先,我要吐槽一下,出题人的语文应该是体育老师教的吧。

原题描述:

现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们会有多少天进行抗议。

输出格式

输出一个整数,表示居民们会抗议的天数。

看到上面描述,外加题目所给实例输入及输出语句,且要确保每个岛屿都能两两到达

,第一印象就是使用最小生成树Kruskal算法。但是,这里要把边的权值变成负值,相应的最小就是该桥能够使用的天数最长,如此再求得最小生成树中的权值绝对值最小的边,即为居民开始进行抗议的天数。

带着这样的思考方式,提交后只得了10分,还是碰巧对的。

带着疑惑心里,看了一些网友的解答,又把题目读了一遍,提取关键点:居民们会抗议的天数,注意是天数,为此我理解为最小生成树中最大权值和最小权值差的绝对值就是答案。但是,网上相关网友的解答都不是这样计算的。

直到,我看到了文末参考资料一篇网友把题目描述修改了一部分,具体如下:

修改后:

现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们一共会发起多少次抗议。

输出

  输出一个整数,表示居民们发起抗议的次数。

把这个天字改为次字,即求取最小生成树中权值不同的个数即为最终所求答案。为此,本题下面先求取最小生成树,然后用HashSet存放权值,最终set集合中元素个数即为最终答案。

下面代码在蓝桥系统中运行超时,具体原因应该是Java语言和C++语言编译运行的性能有关,大部分网友C++写的解答都是使用并查算法,其实Kruskal算法的本质也是并查算法,我用网友C++代码跑的是100分。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Scanner; public class Main {
public static int n, m;
public static int[] id;
public static ArrayList<edge> list = new ArrayList<edge>();
public static HashSet<Integer> set = new HashSet<Integer>(); class MyComparator implements Comparator<edge> {
public int compare(edge arg0, edge arg1) {
if(arg0.t > arg1.t)
return 1;
else if(arg0.t < arg1.t)
return -1;
return 0;
}
} static class edge {
public int a;
public int b;
public int t; public edge(int a, int b, int t) {
this.a = a;
this.b = b;
this.t = t;
}
} public int find(int a) {
int root = a;
while(id[root] >= 0) {
root = id[root];
}
int i = 0, k = a;
while(k != root) {
i = id[k];
id[k] = root;
k = i;
}
return root;
} public void union(int a, int b) {
int rootA = find(a);
int rootB = find(b);
if(rootA == rootB)
return;
int num = id[rootA] + id[rootB];
if(id[rootA] < id[rootB]) {
id[rootB] = rootA;
id[rootA] = num;
} else {
id[rootA] = rootB;
id[rootB] = num;
}
} public void kruskal() {
Collections.sort(list, new MyComparator());
id = new int[n + 1];
for(int i = 1;i <= n;i++)
id[i] = -1;
int count = 0;
for(int i = 0;i < list.size();i++) {
edge p = list.get(i);
if(find(p.a) != find(p.b)) {
set.add(p.t);
union(p.a, p.b);
count++;
if(count == n - 1)
break;
}
}
System.out.println(set.size());
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
for(int i = 0;i < m;i++) {
int a = in.nextInt();
int b = in.nextInt();
int t = in.nextInt();
list.add(new edge(a, b, -1 * t));
}
test.kruskal();
}
}

Java实现 蓝桥杯 历届试题 国王的烦恼的更多相关文章

  1. Java实现蓝桥杯历届试题分考场

    历届试题 分考场 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 n个人参加某项特殊考试. 为了公平,要求任何两个认识的人不能分在同一个考场. 求是少需要分几个考场才能满足条件. 输 ...

  2. Java实现蓝桥杯历届试题兰顿蚂蚁

    历届试题 兰顿蚂蚁 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其 ...

  3. Java实现蓝桥杯历届试题回文数字

    历届试题 回文数字 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做: ...

  4. Java实现蓝桥杯历届试题高僧斗法

    历届试题 高僧斗法 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以 ...

  5. Java实现蓝桥杯历届试题买不到的数目

    历届试题 买不到的数目 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友 ...

  6. Java实现 蓝桥杯 历届试题 斐波那契

    试题 历届试题 斐波那契 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 - (x=1,2) f(x) = f(x-1) ...

  7. Java实现 蓝桥杯 历届试题 小计算器

    历届试题 小计算器 时间限制:1.0s 内存限制:256.0MB 问题描述 模拟程序型计算器,依次输入指令,可能包含的指令有 1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个 ...

  8. Java实现蓝桥杯 历届试题 k倍区间

    历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...

  9. Java实现 蓝桥杯 历届试题 小数第n位

    历届试题 小数第n位 时间限制:1.0s 内存限制:256.0MB 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的 ...

随机推荐

  1. Java 在Excel中创建透视表

    本文内容介绍通过Java程序在Excel表格中根据数据来创建透视表. 环境准备 需要使用Excel类库工具—Free Spire.XLS for Java,这里使用的是免费版,可通过官网下载Jar包并 ...

  2. HDU 2007 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2007 题目大意:给你段连续数字,让你求 all sum of (偶数2 )and all sum of ...

  3. C#winform跨窗体传值和调用事件的办法

    有三个窗体,分别是Main主窗体,Form1窗体1,From2窗体2,其中Main是主窗体,Form1窗体1是一个消息通知窗体,Form2窗体2主窗体的一个子窗体,程序启动时,消息框窗体1弹出,通过消 ...

  4. zabbix server优化与迁移

    zabbix server优化与迁移 1. 概述 zabbix 系统其实分3个大部分,一个是server本身,另一个是php的httpd服务,第三个是非常需要优化的数据库.公司的zabbix监控主机在 ...

  5. ios中fixed元素在滚动布局中的延时渲染问题

    在之前做的一个demo中,有个视图是内滚动的,里边有个bar用了fixed,不是fixed在最外层视图的顶部和底部,在微信/safari/chrome/其他浏览器app上都没出现问题. 然后今天,我把 ...

  6. 运行web容器实例

  7. form组件注册ajax登录auth认证及验证码

    本项目采用django自带的数据库 项目文件 models.py from django.db import models from django.contrib.auth.models import ...

  8. Python PIL Image图片显示系列

    1. PIL Image图片显示 在使用PIL函数中的Image方法读取图片时,对于图片的shape,可能有不少宝宝存在疑惑.是什么疑惑了?就是image = Image.open(image_pat ...

  9. DP+容斥 BZOJ1042

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2558  Solved: 1539[Submit][Stat ...

  10. tomcat——启动项目报错:java.lang.IllegalStateException

    java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' befo ...