diff --git a/naloga4/src/Graf.java b/naloga4/src/Graf.java index c9ed8db..5ef7a8a 100644 --- a/naloga4/src/Graf.java +++ b/naloga4/src/Graf.java @@ -22,9 +22,74 @@ public class Graf { } void grobaSila() { + int n = nodes.length; + int m = 0; + for (MaxHeap.HeapNode node : nodes) { + m += node.value.neighbors.size(); + } + m /= 2; + + int[][] connections = new int[m][2]; + boolean[][] seen = new boolean[n][n]; + int idx = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < nodes[i].value.neighbors.size(); j++) { + int neighbor = nodes[i].value.neighbors.get(j).value.id; + if (!seen[i][neighbor]) { + connections[idx][0] = i; + connections[idx][1] = neighbor; + seen[i][neighbor] = seen[neighbor][i] = true; + idx++; + } + } + } + + int bestCover = getBestCover(n, connections); + + for (int i = 0; i < n; i++) { + if (((bestCover >> i) & 1) != 0) { + System.out.print(i + " "); + } + } + System.out.println(); } + private static int getBestCover(int n, int[][] connections) { + int bestCover = -1; + int minSize = n + 1; + long minPowerSum = Long.MAX_VALUE; + + int maxMask = 1 << n; + for (int mask = 0; mask < maxMask; mask++) { + boolean cover = true; + for (int[] e : connections) { + int u = e[0], v = e[1]; + if (((mask >> u) & 1) == 0 && ((mask >> v) & 1) == 0) { + cover = false; + break; + } + } + if (!cover) continue; + + int size = Integer.bitCount(mask); + long powerSum = 0; + for (int i = 0; i < n; i++) { + if (((mask >> i) & 1) != 0) { + powerSum += 1L << i; + } + } + + if (size < minSize || (size == minSize && powerSum < minPowerSum)) { + minSize = size; + minPowerSum = powerSum; + bestCover = mask; + } + } + return bestCover; + } + + void pozresni() { MaxHeap heap = new MaxHeap<>(this.heap); for (var heapNode : nodes) { @@ -50,18 +115,15 @@ public class Graf { used.add(node.id); } - - print(used); - } - - private void print(ArrList arr) { - int idxStart = arr.size() > 100 ? arr.size() - 100 : 0; - for (int i = idxStart; i < arr.size(); i++) { - System.out.print(arr.get(i)); - if (i < arr.size() - 1) System.out.print(" "); + + int idxStart = used.size() > 100 ? used.size() - 100 : 0; + for (int i = idxStart; i < used.size(); i++) { + System.out.print(used.get(i)); + if (i < used.size() - 1) System.out.print(" "); } System.out.println(); } + } class Node implements Comparable { @@ -82,11 +144,6 @@ class Node implements Comparable { } return deg; } - - @Override - public String toString() { - return "Node [id=" + id + ", degree=" + degree + "]"; - } } class MaxHeap> { @@ -103,11 +160,6 @@ class MaxHeap> { public int compareTo(HeapNode o) { return this.value.compareTo(o.value); } - - @Override - public String toString() { - return this.value.toString(); - } } final private ArrList arr; @@ -208,15 +260,6 @@ class MaxHeap> { return max.value; } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < arr.size(); i++) { - sb.append(arr.get(i)).append(" "); - } - return sb.toString(); - } } class ArrList { @@ -275,13 +318,4 @@ class ArrList { public boolean isEmpty() { return size == 0; } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < size; i++) { - sb.append(array[i]).append(" "); - } - return sb.toString(); - } } diff --git a/naloga4/src/Naloga4.java b/naloga4/src/Naloga4.java index 7d15923..419785a 100644 --- a/naloga4/src/Naloga4.java +++ b/naloga4/src/Naloga4.java @@ -12,8 +12,7 @@ public class Naloga4 { for (int[] povezava : povezave) { g.povezi(povezava[0], povezava[1]); } - g.pozresni(); - g.pozresni(); + g.grobaSila(); } }