题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 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;
}
}
这是一个Java程序,用于解决给定无向图的最小生成树问题。程序首先读取图的节点数和边数,然后通过DoubleSearch类实现二分查找法在数组中查找特定值。如果图不连通,输出orz,否则计算并输出最小生成树的总权重。
973

被折叠的 条评论
为什么被折叠?



