/*输入的第一行包含两个整数n, m,分别表示小岛的个数和桥的数量。
接下来m行,每行三个整数a, b, t,分别表示该座桥连接a号和b号两个小岛,能使用t天。小岛的编号从1开始递增。
数据规模和约定
对于100%的数据,1< =n< =10000,1< =m< =100000,1< =a, b< =n, 1< =t< =100000。*/
//输出一个整数,表示居民们会抗议的天数。
import java.util.Scanner;
public class guowang {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt(),m=in.nextInt();
int a[][]=new int[n+1][n+1];
int count[]=new int[100000];
int day=2,k=1,sum=0;
while(m>0){
a[in.nextInt()][in.nextInt()]=in.nextInt();
--m;
}
for (int i = 0; i <n+1 ; i++){
for (int j = 0; j < n+1; j++) {
while (a[i][j] >= day) {
count[day++] = 1;
break;
}
}
}
for (int h= 0; h< count.length; h++) {
if (count[h] == 1) {
sum++;
}
}
System.out.println(sum);
}
}
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();
}
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!