输入:
N,M
以下M行,格式为 p q k,表示节点p和q之间的路径长度为k
求连通N个节点所用路径的最大值 最小是多少
思路:类似最小生成树,贪心法,直到图连通,算法终止,返回此时用到的最长路径
难点:贪心+图连通检测(并查集)
并查集:
功能:两个,查找根节点(即判断是否属于某个集合),合并集合(将两个集合中任意两个点相连,即可连通两个分量)
步骤:
1、将路径按长度从小到大排序
2、按长度添加路径,更新并查集pre数组
3、知道整个图连通,停止添加,返回当前的最长路径长度
import java.util.*;
import static java.lang.System.out;
class MyComprator implements Comparator {
public int compare(Object o1, Object o2) {
int[] one = (int[]) o1;
int[] two = (int[]) o2;
if(one[2]two[2]) return 1;
else {
if(one[0]two[0]) return 1;
}
return 0;
}
}
public class Main {
public static int find(int[] pre,int target){
int r=target;
while(pre[r]!=r) //find root
r=pre[r];
int i=target;
int j;
while(i!=r){//路径压缩
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
public static void join(int [] pre,int x,int y){
if(find(pre,x)==find(pre,y)) return;
pre[y]=pre[x];
return;
}
public static boolean testpre(int [] pre){
int index=1;
while(index
代码未经测试,仅以说明思路
-------------------------------------------------------
以上代码正确率仅为20%,原因未及时更新pre[]
AC代码
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import static java.lang.System.out;
class MyComprator implements Comparator {
public int compare(Object o1, Object o2) {
int[] one = (int[]) o1;
int[] two = (int[]) o2;
if(one[2]two[2]) return 1;
else {
if(one[0]two[0]) return 1;
}
return 0;
}
}
public class Main_findTreasure {
public static int find(int[] pre,int target){
int r=target;
while(pre[r]!=r) //find root
r=pre[r];
int i=target;
int j;
while(i!=r){//路径压缩
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
public static void update_pre(int[] pre,int r,int new_r){
for(int i=1;i