Naloga 4
This commit is contained in:
		
							parent
							
								
									8e8e0d3598
								
							
						
					
					
						commit
						c220ccf97c
					
				@ -22,8 +22,73 @@ 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);
 | 
			
		||||
@ -51,17 +116,14 @@ 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