Tấn công thành trì (Thuật toán Prim tìm cây khung lớn nhất)

package Advance;

import java.io.FileInputStream;
import java.util.Scanner;

public class AttackOnTower {
int V;
int Result;
int matrix[][];
int value[];
boolean visit[];
int key[];
public static void main(String[] args) throws Exception {
new AttackOnTower().inIt();
}

private void inIt() throws Exception {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int test_case = 1; test_case <= T; test_case++) {
V = sc.nextInt();
Result = 0;
matrix = new int[V][V];
value = new int[V];
visit = new boolean[V];
key = new int[V];
int u = 0, v = 0, w = 0, e = 0;
for (int i = 0; i < V; i++) {
u = sc.nextInt();
value[u] = sc.nextInt();
e = sc.nextInt();
for (int j = 0; j < e; j++) {
v = sc.nextInt();
matrix[u][v] = 1;
}
}
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if(matrix[i][j] == 1) {
matrix[i][j] = value[i] + value[j];
}
}
}
for (int i = 0; i < V - 1; i++) {
for (int j = i + 1; j < V; j++) {
Result += matrix[i][j];
}
}
Prim(0);
int k = 0;
for (int i = 0; i < V; i++) {
k += key[i];
}
Result -= k;
System.out.println(Result);
}
}
private void Prim(int start) {
for (int i = 0; i < V; i++) {
key[i] = 0;
visit[i] = true;
}
key[start] = 0;
for (int i = 0; i < V - 1; i++) {
int u = timMinKey();
visit[u] = false;
for (int j = 0; j < V; j++) {
if(visit[j] && j!=u && matrix[u][j] >= key[j]){
key[j] = matrix[u][j];
}
}
}
}

private int timMinKey() {
int min = 0, u = 0;
for (int i = 0; i < V; i++) {
if(visit[i] && key[i] >= min){
min = key[i];
u = i;
}
}
return u;
}
}

Nhận xét

Bài đăng phổ biến từ blog này

Nâng cấp máy tính (Thuật toán quay lui)

Battle City (Thuật toán BFS)