牛客网模拟笔试一-编程题2:最小生成树

输入:

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

你可能感兴趣的:(求职)