package com.liang.poj;
import java.util.Scanner;
public class Test2485Prim {
static int n = 0;
static int[][] cin = null;
static boolean[] visited = null;
static int[] result = null;
static boolean b = true;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
n = scan.nextInt();
cin = new int[n][n];
visited = new boolean[n];
result = new int[n];
for (int i = 0; i < cin.length; i++) { // 初始化cin result
for (int j = 0; j < cin[i].length; j++) {
cin[i][j] = scan.nextInt();
if (b) {
result[j] = cin[i][j];
}
}
b = false;
}
visited[0] = true;
prim(n - 1);
}
}
public static void prim(int count) {
int sum = 0;
while (count >= 1) {
int lie = min();
count--;
for (int i = 1; i < result.length; i++) {
if (!visited[i]) {
if (result[i] == 0 || result[i] > cin[lie][i]) {
result[i] = cin[lie][i];
}
}
}
}
for(int i=0; i<result.length; i++) { // 求最小生成树的权值和
sum += result[i];
}
System.out.println(sum);
int min = result[1];
int max = result[1];
for (int i = 2; i < result.length; i++) {
if (min > result[i]) {
min = result[i];
}
if (max < result[i]) {
max = result[i];
}
}
System.out.println(min); // 求最小生成树中权值最小的边
System.out.println(max); // 求最小生成树中权值最大的边
}
public static int min() { // 求没有遍历过的边中权值最小的边
int min = 0;
int lie = 0;
for (int i = 1; i < result.length; i++) {
if (result[i] != 0 && !visited[i]) {
min = result[i];
lie = i;
break;
}
}
for (int i = 1; i < result.length; i++) {
if (result[i] != 0 && !visited[i]) {
if (min > result[i]) {
min = result[i];
lie = i;
}
}
}
if (lie != 0) {
visited[lie] = true;
}
return lie;
}
}
Prim最小生成树(求,生成树中权值的和,最大权值,最小权值) 参考poj1258 2485
最新推荐文章于 2022-07-27 19:36:13 发布