【題目】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);
			}
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章