Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1.  
  2. import java.util.*;
  3.  
  4. public class Neighbor_joining {
  5.  
  6. public static void main(String[] args) {
  7.  
  8. Scanner sc = new Scanner(System.in);
  9. int size = sc.nextInt();
  10. String names[] = new String[size];
  11. int values[][][] = new int[size][size][size];
  12. int sum[][] = new int[size][size];
  13. for (int i = 0; i < size; i++) {
  14. names[i] = sc.next();
  15. for (int j = 0; j < size; j++) {
  16. values[0][i][j] = sc.nextInt();
  17. sum[0][i] += values[0][i][j];
  18. }
  19. }
  20. int njvalues[][] = new int[size][size];
  21. for (int i = 0; i < size; i++) {
  22. for (int j = 0; j < size; j++) {
  23. if (i == j) {
  24. njvalues[i][j] = 0;
  25. } else {
  26. njvalues[i][j] = (size - 2) * values[0][i][j] - sum[0][i] - sum[0][j];
  27. }
  28. }
  29. }
  30. boolean x = true;
  31. int min = 999999999;
  32. int minvalues[] = new int[2];
  33. float limblength[] = new float[size];
  34. Map<String, Float> output = new HashMap<String, Float>();
  35. int iteration = 0;
  36. while (iteration != size) {
  37. for (int i = 0; i < size - iteration; i++) {
  38. for (int j = 0; j < size - iteration; j++) {
  39. if (njvalues[i][j] < min && i != j) {
  40. min = njvalues[i][j];
  41. minvalues[0] = i;
  42. minvalues[1] = j;
  43. }
  44. }
  45. }
  46. float delta = 0;
  47. if (size - iteration - 2 > 0) {
  48. delta = (sum[iteration][minvalues[0]] - sum[iteration][minvalues[1]]) / (size - iteration - 2);
  49. } else {
  50. delta = sum[iteration][minvalues[0]] - sum[iteration][minvalues[1]];
  51. }
  52. limblength[minvalues[0]] = (values[iteration][minvalues[0]][minvalues[1]] + delta) / 2;
  53. limblength[minvalues[1]] = (values[iteration][minvalues[0]][minvalues[1]] - delta) / 2;
  54. if (!output.keySet().contains(names[minvalues[0]])) {
  55. output.put(names[minvalues[0]], limblength[minvalues[0]]);
  56. }
  57. if (!output.keySet().contains(names[minvalues[1]])) {
  58. output.put(names[minvalues[1]], limblength[minvalues[1]]);
  59. }
  60. iteration++;
  61. for (int i = 0; i < (size - iteration); i++) {
  62. for (int j = 0; j < (size - iteration); j++) {
  63. if (i == minvalues[1] || j == minvalues[1]) {
  64. values[iteration][i][j] = 0;
  65. } else if (i != j) {
  66. if (i == minvalues[0]) {
  67. values[iteration][i][j] = values[iteration - 1][minvalues[0]][j] + values[iteration - 1][minvalues[1]][j] - values[iteration - 1][minvalues[0]][minvalues[1]];
  68. } else if (j == minvalues[0]) {
  69. values[iteration][i][j] = values[iteration - 1][i][minvalues[0]] + values[iteration - 1][i][minvalues[1]] - values[iteration - 1][minvalues[0]][minvalues[1]];
  70. }
  71. }
  72. sum[iteration][i] += values[iteration][i][j];
  73. }
  74. }
  75.  
  76. for (int i = 0; i < size - iteration; i++) {
  77. for (int j = 0; j < size - iteration; j++) {
  78. if (values[iteration][i][j] == 0) {
  79. njvalues[i][j] = 0;
  80. } else {
  81. njvalues[i][j] = (size - iteration - 2) * values[iteration][i][j] - sum[iteration][i] - sum[iteration][j];
  82. }
  83. }
  84. }
  85. min = 999999999;
  86. }
  87. for (Map.Entry m : output.entrySet()) {
  88. System.out.println(m.getKey() + " " + m.getValue());
  89. }
  90. }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement