Naloga 4
This commit is contained in:
parent
8e8e0d3598
commit
c220ccf97c
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -12,8 +12,7 @@ public class Naloga4 {
|
||||
for (int[] povezava : povezave) {
|
||||
g.povezi(povezava[0], povezava[1]);
|
||||
}
|
||||
g.pozresni();
|
||||
g.pozresni();
|
||||
g.grobaSila();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user