题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz
。
输入格式
第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。
接下来 M 行每行包含三个整数 Xi,Yi,Zi,表示有一条长度为Zi 的无向边连接结点 Xi,Yi。
输出格式
如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz
。
输入输出样例
输入 #1复制
4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3
输出 #1复制
7
package Exercise01; import java.net.BindException; import java.util.Scanner; public class Exercise { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //n表示有n个数字 int n = scanner.nextInt(); //m表示有m次询问 int m = scanner.nextInt(); int[] arr = new int[n]; for (int i = 0; i < arr.length; i++) { arr[i] = scanner.nextInt(); } System.out.println(); for (int i = 0; i < m; i++) { int num = scanner.nextInt(); DoubleSearch bs = new DoubleSearch(); int index = bs.ds(arr, num, 0, arr.length - 1); if (index == -1) { System.out.println(-1 + " "); } else { while (true) { if(index -1 > 0 && arr[index-1] == arr[index]) { index--; }else { break; } } System.out.printf(index + 1 + " "); } } } } class DoubleSearch { /** * @param arr * @param num 需要查找的数字 * @param left 左索引 * @param right 右索引 * @return */ public int ds(int[] arr, int num, int left, int right) { if(left >= right) { return -1; } int pivot = (left + right) / 2; int index = -1; if (arr[pivot] > num) { index = ds(arr, num, left, --pivot); } else if (arr[pivot] < num) { index = ds(arr, num, ++pivot, right); } else { return pivot; } return index; } }