Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. package prim;
  2.  
  3. import java.util.*;
  4.  
  5. public class Prim {
  6.  
  7. PriorityQueue<Solmu> keko;
  8. ArrayList<Solmu>[] vieruslista;
  9. int[] etaisyys;
  10. Solmu[] vanhempi;
  11. int[][] painot;
  12. boolean[] onkoPuussa;
  13. Solmu[] verkko;
  14. int n;
  15.  
  16. int maara;
  17. int laskuri;
  18. HashSet<Kaari> kaaret;
  19.  
  20. public Prim(int n) {
  21. this.keko = new PriorityQueue<>();
  22. this.vieruslista = new ArrayList[n+1];
  23. this.etaisyys = new int[n+1];
  24. this.vanhempi = new Solmu[n+1];
  25. this.painot = new int[n+1][n+1];
  26. this.onkoPuussa = new boolean[n+1];
  27. this.verkko = new Solmu[n+1];
  28. this.n = n;
  29.  
  30. this.maara = 0;
  31. this.laskuri = 0;
  32. this.kaaret = new HashSet<>();
  33.  
  34. for (int i = 1; i <= n; i++) {
  35. vieruslista[i] = new ArrayList();
  36. }
  37.  
  38. onkoPuussa[1] = true;
  39.  
  40. etaisyys[1] = 0;
  41.  
  42. for (int i = 2; i <= n; i++) {
  43. etaisyys[i] = Integer.MAX_VALUE;
  44. }
  45.  
  46. }
  47.  
  48. public class Solmu implements Comparable {
  49. public int numero, etaisyys;
  50.  
  51. public Solmu(int solmu) {
  52. this.numero = solmu;
  53. this.etaisyys = Integer.MAX_VALUE;
  54. }
  55.  
  56. @Override
  57. public int compareTo(Object o) {
  58. Solmu toinen = (Solmu) o;
  59. return this.etaisyys - toinen.etaisyys;
  60. }
  61. }
  62.  
  63. public class Kaari implements Comparable {
  64. public int alku, loppu, paino;
  65.  
  66. public Kaari(int alku, int loppu, int paino) {
  67. this.alku = alku;
  68. this.loppu = loppu;
  69. this.paino = paino;
  70. }
  71.  
  72. @Override
  73. public int compareTo(Object t) {
  74. Kaari toinen = (Kaari) t;
  75. return this.paino - toinen.paino;
  76. }
  77. }
  78.  
  79. public void lisaaTie(int a, int b, int x) {
  80.  
  81. if (painot[a][b] > 0 && painot[a][b] < x) return;
  82.  
  83. Solmu solmuA = new Solmu(a);
  84. Solmu solmuB = new Solmu(b);
  85.  
  86. painot[a][b] = x;
  87. painot[b][a] = x;
  88.  
  89. vieruslista[a].add(solmuB);
  90. vieruslista[b].add(solmuA);
  91. }
  92.  
  93. public int laske() {
  94.  
  95. Solmu eka = new Solmu(1);
  96. eka.etaisyys = 0;
  97. keko.add(eka);
  98. verkko[1] = eka;
  99.  
  100. for (int i = 2; i <= n; i++) {
  101. Solmu uusi = new Solmu(i);
  102. verkko[i] = uusi;
  103. keko.add(uusi);
  104. }
  105.  
  106. int paino = 0;
  107. Solmu solmu;
  108.  
  109. while (!keko.isEmpty()) {
  110.  
  111. solmu = keko.poll();
  112.  
  113. if (vanhempi[solmu.numero] != null) {
  114. laskuri++;
  115. paino = paino + painot[vanhempi[solmu.numero].numero][solmu.numero];
  116.  
  117. int u = solmu.numero;
  118. int uv = vanhempi[solmu.numero].numero;
  119.  
  120. kaaret.add(new Kaari(uv, u, painot[u][uv]));
  121.  
  122. onkoPuussa[solmu.numero] = true;
  123. }
  124.  
  125. for (int i = 0; i < vieruslista[solmu.numero].size(); i++) {
  126.  
  127. Solmu v = vieruslista[solmu.numero].get(i);
  128.  
  129. if (!onkoPuussa[v.numero] && painot[solmu.numero][v.numero] < etaisyys[v.numero]) {
  130. vanhempi[v.numero] = solmu;
  131. etaisyys[v.numero] = painot[solmu.numero][v.numero];
  132. verkko[v.numero].etaisyys = etaisyys[v.numero];
  133. keko.add(keko.poll());
  134. }
  135. }
  136. }
  137.  
  138.  
  139. for (int i = 0; i < onkoPuussa.length; i++) {
  140. if (onkoPuussa[i]) maara++;
  141. }
  142.  
  143. return paino;
  144. }
  145.  
  146. public static void main(String[] args) {
  147.  
  148. HashSet<Integer> solmut = new HashSet<>();
  149.  
  150. int n = 5000;
  151. int m = 100000;
  152.  
  153. Prim k = new Prim(n);
  154.  
  155. Random r = new Random(1337);
  156. for (int i = 1; i <= m; i++) {
  157. int a = r.nextInt(n)+1;
  158. int b = r.nextInt(n)+1;
  159. int x = r.nextInt(1000)+1;
  160. k.lisaaTie(a,b,x);
  161.  
  162. solmut.add(a);
  163. solmut.add(b);
  164. }
  165.  
  166. long alku = System.nanoTime();
  167.  
  168. System.out.println(k.laske());
  169.  
  170. long loppu = System.nanoTime();
  171.  
  172. int pieninPainoKaarista = 0;
  173. for (Kaari kaari : k.kaaret) {
  174. pieninPainoKaarista += kaari.paino;
  175. }
  176. System.out.println("pienin paino kaarista laskettuna on "+pieninPainoKaarista);
  177. System.out.println("Kaarien määrä: " + k.kaaret.size());
  178. System.out.println("Kuinka monta kertaa päästään if-lauseeseen: " + k.laskuri);
  179.  
  180. System.out.println("Virittävässä puussa solmuja: " + k.maara);
  181.  
  182. System.out.println("Solmuja on: " + solmut.size());
  183.  
  184. System.out.println("Aikaa kului "+((loppu-alku)/1e9)+" s");
  185. }
  186.  
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement