Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- public class Neighbor_joining {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int size = sc.nextInt();
- String names[] = new String[size];
- int values[][][] = new int[size][size][size];
- int sum[][] = new int[size][size];
- for (int i = 0; i < size; i++) {
- names[i] = sc.next();
- for (int j = 0; j < size; j++) {
- values[0][i][j] = sc.nextInt();
- sum[0][i] += values[0][i][j];
- }
- }
- int njvalues[][] = new int[size][size];
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- if (i == j) {
- njvalues[i][j] = 0;
- } else {
- njvalues[i][j] = (size - 2) * values[0][i][j] - sum[0][i] - sum[0][j];
- }
- }
- }
- boolean x = true;
- int min = 999999999;
- int minvalues[] = new int[2];
- float limblength[] = new float[size];
- Map<String, Float> output = new HashMap<String, Float>();
- int iteration = 0;
- while (iteration != size) {
- for (int i = 0; i < size - iteration; i++) {
- for (int j = 0; j < size - iteration; j++) {
- if (njvalues[i][j] < min && i != j) {
- min = njvalues[i][j];
- minvalues[0] = i;
- minvalues[1] = j;
- }
- }
- }
- float delta = 0;
- if (size - iteration - 2 > 0) {
- delta = (sum[iteration][minvalues[0]] - sum[iteration][minvalues[1]]) / (size - iteration - 2);
- } else {
- delta = sum[iteration][minvalues[0]] - sum[iteration][minvalues[1]];
- }
- limblength[minvalues[0]] = (values[iteration][minvalues[0]][minvalues[1]] + delta) / 2;
- limblength[minvalues[1]] = (values[iteration][minvalues[0]][minvalues[1]] - delta) / 2;
- if (!output.keySet().contains(names[minvalues[0]])) {
- output.put(names[minvalues[0]], limblength[minvalues[0]]);
- }
- if (!output.keySet().contains(names[minvalues[1]])) {
- output.put(names[minvalues[1]], limblength[minvalues[1]]);
- }
- iteration++;
- for (int i = 0; i < (size - iteration); i++) {
- for (int j = 0; j < (size - iteration); j++) {
- if (i == minvalues[1] || j == minvalues[1]) {
- values[iteration][i][j] = 0;
- } else if (i != j) {
- if (i == minvalues[0]) {
- values[iteration][i][j] = values[iteration - 1][minvalues[0]][j] + values[iteration - 1][minvalues[1]][j] - values[iteration - 1][minvalues[0]][minvalues[1]];
- } else if (j == minvalues[0]) {
- values[iteration][i][j] = values[iteration - 1][i][minvalues[0]] + values[iteration - 1][i][minvalues[1]] - values[iteration - 1][minvalues[0]][minvalues[1]];
- }
- }
- sum[iteration][i] += values[iteration][i][j];
- }
- }
- for (int i = 0; i < size - iteration; i++) {
- for (int j = 0; j < size - iteration; j++) {
- if (values[iteration][i][j] == 0) {
- njvalues[i][j] = 0;
- } else {
- njvalues[i][j] = (size - iteration - 2) * values[iteration][i][j] - sum[iteration][i] - sum[iteration][j];
- }
- }
- }
- min = 999999999;
- }
- for (Map.Entry m : output.entrySet()) {
- System.out.println(m.getKey() + " " + m.getValue());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement