This commit is contained in:
Gašper Dobrovoljc 2025-05-09 17:42:38 +02:00
parent 8e8e0d3598
commit c220ccf97c
No known key found for this signature in database
GPG Key ID: 0E7E037018CFA5A5
2 changed files with 72 additions and 39 deletions

View File

@ -22,9 +22,74 @@ public class Graf {
}
void grobaSila() {
int n = nodes.length;
int m = 0;
for (MaxHeap<Node>.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<Node> 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<Integer> 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<Node> {
@ -82,11 +144,6 @@ class Node implements Comparable<Node> {
}
return deg;
}
@Override
public String toString() {
return "Node [id=" + id + ", degree=" + degree + "]";
}
}
class MaxHeap<T extends Comparable<T>> {
@ -103,11 +160,6 @@ class MaxHeap<T extends Comparable<T>> {
public int compareTo(HeapNode o) {
return this.value.compareTo(o.value);
}
@Override
public String toString() {
return this.value.toString();
}
}
final private ArrList<HeapNode> arr;
@ -208,15 +260,6 @@ class MaxHeap<T extends Comparable<T>> {
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<T> {
@ -275,13 +318,4 @@ class ArrList<T> {
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();
}
}

View File

@ -12,8 +12,7 @@ public class Naloga4 {
for (int[] povezava : povezave) {
g.povezi(povezava[0], povezava[1]);
}
g.pozresni();
g.pozresni();
g.grobaSila();
}
}