Problem_D(網絡連接prim)
有一個保證能聯通的計算機網絡(連通圖),Aij表示i計算機聯通到j計算機的開銷,保證 :Aii = 0 , Aij = Aji ,Aij <= 100;
輸入:
第一行輸入T (T=1),表示數據的組數
每組第一行輸入N (0 < N <= 50),表示網絡內計算機的數目
然後n行輸入Ai0 - Ai n-1
1
6
0 1 4 3 7 3
1 0 2 5 1 8
4 2 0 3 9 2
3 5 3 0 1 4
7 1 9 1 0 3
3 8 2 4 3 0
輸出:
返回連通這個計算機網絡需要的最小開銷
7
普里姆解法(一個點出發)
import java.util.Scanner;
/*
有一個保證能聯通的計算機網絡(連通圖),
Aij表示i計算機聯通到j計算機的開銷,
保證 :Aii = 0 , Aij = Aji ,Aij <= 100;
輸入:
第一行輸入T (T=1),表示數據的組數
每組第一行輸入N (0 < N <= 50),表示網絡內計算機的數目
然後n行輸入Ai0 - Ai n-1
1
6
0 1 4 3 7 3
1 0 2 5 1 8
4 2 0 3 9 2
3 5 3 0 1 4
7 1 9 1 0 3
3 8 2 4 3 0
輸出:
返回連通這個計算機網絡需要的最小開銷
7
*/
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt();
for(int i = 0; i < n; i++) {
int length = scanner.nextInt();
int[][] nums = new int[length][length];
boolean[] check = new boolean[length];
int[] prim = new int[length];
int result = 0;
prim[0] = 1;
check[0] = true;
for(int j = 0; j < length; j++)
for(int k = 0; k < length; k++)
nums[j][k] = scanner.nextInt();
for(int l = 0; l < length - 1; l++) {
int min = Integer.MAX_VALUE;
int pos = 0;
for(int j = 0; j < prim.length; j++) {
if(prim[j] == 0) continue;
for(int k = 0; k < length; k++)
if(nums[j][k] < min && !check[k] && nums[j][k] != 0) {
min = nums[j][k];
pos = k;
prim[k] = 1;
}
}
result += min;
check[pos] = true;
}
System.out.println(result);
}
}
}
}
克魯斯卡爾解法(選最小)
import java.util.Scanner;
/*
有一個保證能聯通的計算機網絡(連通圖),
Aij表示i計算機聯通到j計算機的開銷,
保證 :Aii = 0 , Aij = Aji ,Aij <= 100;
輸入:
第一行輸入T (T=1),表示數據的組數
每組第一行輸入N (0 < N <= 50),表示網絡內計算機的數目
然後n行輸入Ai0 - Ai n-1
1
6
0 1 4 3 7 3
1 0 2 5 1 8
4 2 0 3 9 2
3 5 3 0 1 4
7 1 9 1 0 3
3 8 2 4 3 0
輸出:
返回連通這個計算機網絡需要的最小開銷
7
*/
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt();
for(int i = 0; i < n; i++) {
int length = scanner.nextInt();
boolean[] check = new boolean[length];
int result = 0;
int[][] nums = new int[length][length];
for(int j = 0; j < length; j++)
for(int k = 0; k < length; k++)
nums[j][k] = scanner.nextInt();
for(int l = 0; l < length - 1; l++) {
int min = Integer.MAX_VALUE;
int pos1 = 0, pos2 = 0;
for(int j = 0; j < length; j++) {
int k = j + 1;
for(; k < length; k++)
if(nums[j][k] < min && (!check[j] || !check[k]) ) {
min = nums[j][k];
pos1 = j;
pos2 = k;
}
}
result += min;
check[pos1] = true;
check[pos2] = true;
}
System.out.println(result);
}
}
}
}