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);
}
}
}
}