【题目】Problem D.网络连接(普里姆、克鲁斯卡尔解法)

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);
			}
		}
	}
}
发布了233 篇原创文章 · 获赞 254 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_44485744/article/details/104888095
今日推荐